Prism + MEF: задержка экспорта сервиса из prism-модуля - PullRequest
1 голос
/ 09 сентября 2010

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

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

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

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 13 сентября 2010

Вы пробовали 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 голосов
/ 23 сентября 2010

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

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

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

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

Спасибо, Damian

...