2016-02-19 5 views
1

Позвольте мне объяснить очень упрощенный пример того, что мне нужно. Предположим, что у меня есть VS-решение, которое использует MEF и имеет следующую, широкую структуру проектов и классов.Как я могу использовать один и тот же объект CompositionConainer (или он содержит сборки) в моем решении?

  1. Сервер (Project)
    • Server.cs (Содержит Main метод, для запуска приложения.)
  2. Shared (проект)
    • \ Контракты
      • ILogger.cs
      • ISettings.cs
  3. Настройки (Project)
    • MySettings.cs (класс, реализующий ISettings)
  4. Logger (проект
    • MyLogger.cs (класс осуществление ILogger)

Учитывая ...

  • Все вышеперечисленные проекты ссылаются на общий проект.
  • Сервер является стартовым приложением, которое инициализирует все каталоги в контейнер приложения.

... Я могу запустить приложение и инициализировать синглтон из MySettings и MyLogger из моей Server приложения. Все идет нормально.

Теперь давайте предположим, что MyLogger должен получить доступ к файлу настроек для выходного каталога. Значение для местоположения каталога сохраняется в объекте MySettings, который инициализируется в Server.cs в CompositonContainer.

Поскольку я использую MEF, я не хочу ссылаться на проект Settings в рамках проекта Logger. Вместо этого я хотел бы использовать MEF для получения текущих приложений ISettings singleton, который был инициализирован в начале моего приложения Server и существует с серверами CompositionContainer.

Как я могу правильно получить доступ к одиночному тону MySettings в пределах MyLogger с использованием MEF?

ответ

1

Сервер:

class Services 
{ 
    [Import] 
    public ISettings Settings 
    { 
     get; set; 
    } 

    [Import] 
    public ILogger Logger 
    { 
     get; set; 
    } 

} 


static void Main() 
{ 
    AggregateCatalog catalog = new AggregateCatalog(); 
    catalog.Add(new AssemblyCatalog(Assembly.GetAssembly(typeof(SettingsProject.MySettings)); 
    catalog.Add(new AssemblyCatalog(Assembly.GetAssembly(typeof(LoggerProject.MyLogger)); 


    Services services = new Services(); 

    CompositionContainer cc = new CompositionContainer(catalog); 
    cc.ComposeParts(services); 

    // services properties are initialized   

} 

Настройки проекта

[Export(typeof(ISettings)] 
class MySettings 
{ 
} 

Logger Проект

[Export(typeof(ILogger)] 
class MyLogger : ILogger 
{ 
    [ImportingConstructor] 
    public MyLogger(ISettings settings) 
    { 
    } 
} 
+0

Thabk вы для ответа! Когда я вернусь в свой офис в понедельник, я проверю это. Кажется, это решение. – RLH

Смежные вопросы