Использование EventAggregator (или что-то еще - IoC может быть) с MEF - PullRequest
1 голос
/ 14 декабря 2010

Я сейчас создаю проект MEF, чтобы научиться использовать его в практических приложениях.Я успешно импортировал модуль DataHandler для обеспечения соединений с базой данных и других централизованных операций с базой данных.

Теперь я думаю о способе предоставления методов другим импортированным модулям.Например, если модуль безопасности требует подключения к базе данных, он сможет запросить подключение к базе данных.Теперь у меня есть способ для модуля определить, доступен ли DataHandler, так как приложение Host делает его общедоступным.Поэтому мне интересно, был ли способ использовать EventAggregator для публикации типа события, при котором подписчик (модуль безопасности) просто запускает событие и получает взамен объект DbConnection.

Если EventAggregator является ответом, я мог бы использовать некоторые подсказки относительно того, как.Имейте в виду, что я все еще исследую ... не просто спрашиваю коде .Если есть лучшее решение, меня интересуют варианты.

В настоящее время я рассматриваю этот пост Денис Вуйка

Редактировать

EventAggregatorпохоже, это не тот инструмент, который нужно использовать.Есть ли какой-нибудь слабо связанный обмен сообщениями, который я могу реализовать в своем приложении Host?Может ли быть реализован локатор служб или шаблон команд?

Ответы [ 2 ]

2 голосов
/ 14 декабря 2010

Звучит так, будто вы ищете Сервисный локатор , а не EventAggregator.

Но зачем запрашивать сервисы через сервисный локатор, если вы уже вводите эти сервисы с помощью MEF?Если вам необходимо получить услуги позже во время выполнения, вы можете вместо этого ввести Lazy<T> или фабрику.

1 голос
/ 15 декабря 2010

Я передаю свою конфигурацию всем модулям, экспортируя основной интерфейс приложения. Вы можете иметь единственный экземпляр вашего интерфейса БД, размещенный в основном приложении.

Хост-приложение экспортирует себя и все плагины импортируют его и имеют доступ к своему интерфейсу Смотрите мой пример ниже:

Интерфейс:

public interface IMainApp
{
    ConfigClass Config { get; set; } 
}

Хост приложение:

[Export(typeof(IMainApp))]
public class Host : IMainApp
{
    public Host()
    { /* Compose parts etc here..? */ }

    public ConfigClass Config { get; set; }  

    [Import(typeof(IModule))]
    public List<IModule> LoadedModules { get; set; }
}

Плагин в сборе:

[Export(typeof(IModule))]
public class Module : IModule
{        
    public Module() { }

    [Import(typeof(IMainApp))]
    public IMainApp Host { get; set; } 

    public void DoSomething()
    {
        Host.Config... // use config here
    }
}
...