2010-09-09 6 views
1

У меня есть приложение, основанное на Prism (v4 ctp) и MEF. Приложение имеет сервис IService1. Я хочу, чтобы эта реализация сервиса была экспортирована некоторым модулем (не только обнаруженный MEF)Prism + MEF: отсроченный экспорт услуг из призматического модуля

public interface IService1 {} 
public class Service1Impl: IService1 {} 

Service1Impl не ExportAttribute. Это потому что я хочу, чтобы создать реализацию вручную в моей Призма-модуль:

[ModuleExport(typeof(SomeModule))] 
[PartCreationPolicy(CreationPolicy.Shared)] 
public SomeModule: IModule 
{ 
    [Export] 
    public IService1 Service1 {get; private set} 

    public void Initialize() 
    { 
     Service1 = new Service1Impl(); 
    } 
} 

В некоторых других компонентов, которые я хочу получить реализацию IService1 через MEF Импорт. Проблема заключается в том, как сказать MEF делать экспорт (в SomeModule) после того, как Initialize был вызван Prism?

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

Итак, какие у меня варианты?

ответ

1

Вы пробовали функцию ModuleDependency? Мне нужно сделать еще несколько исследований по MEF, но в Prism вы можете гарантировать, что Инициализация одного модуля срабатывает перед другими через ModuleDependency.

Например, если у вас был SomeOtherModule, который нуждался в IService1 во время инициализации, вы могли бы убедиться, что SomeModule был инициализирован первым таким образом.

[ModuleDependency("SomeModule")] 
public class SomeOtherModule : IModule 
{ 
    [Import] 
    public IService1 Service1 {get; set;} 

    public void Initialize() 
    { 
     //This ought to be populated now. 
     Service1.DoSomething(); 
    } 
} 

Я полностью квалифицируя это, говоря, что я не мог бы знать некоторую внутреннюю работу MEF, что не позволяет, но это то, как вещи работают в основном с Prism.

Как и в сторону, когда я вижу зависимость, будь то явно или неявно, я спрашиваю себя:

  1. ли услуга будет использоваться несколькими модулями? Имеет ли смысл продвигать услугу как нечто, созданное в Bootstrapper и предоставляемое хостинговым приложением, а не другой модуль?
  2. Если нет # 1, если есть зависимость между модулями, эти модули логически одинаковы? Должны ли они сочетаться? Если человек не может жить без другого, есть несколько причин не комбинировать их.

В любом случае, это последний момент, о котором стоит подумать.

Надеюсь, это поможет.

+0

Спасибо, но если честно, мне не нравится этот подход, поскольку он создает зависимости между модулями, которые экспортируют услуги и модули, которые импортируют услуги. Нехорошо я верю. – Shrike

+0

@Shrike У вас уже есть неявная зависимость. Вы ожидаете, что реализация службы будет предоставлена ​​другим модулем, а часть вашего процесса завершится неудачно, если его там нет. Вот почему я разместил раздел «Как в стороне» ... у вас есть зависимость между вашими модулями, которые вам нужно адресовать. Мне тоже не нравится ModuleDependency, но вы должны каким-то образом обращаться к предполагаемой зависимости. Если не ModuleDependency, то один из других подходов, перечисленных мной. –

0

Я немного ржавен на моем использовании MEF, но эти идеи могут быть полезны. Что делать, если свойство имеет concreate типа реализации, но вы экспортируете собственность через договор с указанием интерфейса (я думаю, что это было похоже на следующее):

[Export(IService1)] 
public Service1Impl Service1 {get; private set} 

Затем каждый модуль, который имеет импорт проверки для Интерфейс IService1 получит конкретную реализацию от этого модуля (что является основной целью кодирования интерфейса).

Надеюсь, это поможет вам в правильном направлении.

Спасибо, Damian

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