Я думаю, что это соответствует не Призмам или MEF, а принципу инжекций зависимостей и лучшим практикам в целом. (Да, я завязываю, что MEF не является контейнером DI, но здесь он используется почти как контейнер DI, поэтому я предполагаю использовать те же методы здесь).
В передовой практике DI (this книга очень круто, я настоятельно рекомендую) это хорошо, чтобы иметь такие шаги в DI «рабочий процесс»:
- регистр все необходимые типы (в Prism - по Загрузчик. ConfigureCatalog метод())
- решительность корневой объект - метод (со всеми вложенными объектами в Prism. по Bootstrapper.CreateShell())
- использовать ваш корневой объект
- релиз вы корневой объект
В идеале вы НЕ должны использовать контейнер DI больше. Ваш код не должен знать о существовании контейнера DI (с этой стороны Unity действительно является контейнером DI, потому что вы можете написать код, который не знает об использовании контейнера DI). Если ваш код знает об этом - он задерживает контейнер DI, и это плохо.
PS.Если вы хотите использовать MEF контейнер в вашем модуле в любом случае (например, потому, что вы не очень хорошо знакомы с DI парадигме или у вас есть некоторые очень конкретные задачи), вы можете попробовать что-то вроде:
[ModuleExport(typeof(YourModule))]
public class YourModule : IModule
{
public static CompositionContainer CompositionContainer;
[ImportingConstructor]
public void YourModule(CompositionContainer container)
{
this.CompositionContainer = container;
}
}
ли не забудьте зарегистрировать свой контейнер MEF непосредственно в вашем Boostrapper:
public class YourBootstrapper: MefBootstrapper
{
protected override CompositionContainer CreateContainer()
{
var container = base.CreateContainer();
container.ComposeExportedValue(container);
return container;
}
}
, в то время как я согласен с лучшими практиками, документация призмы четко указывает, что вы можете использовать метод Initialize вашего метода, а также «Зарегистрировать общие службы с контейнером для инъекций приложения». http://msdn.microsoft.com/en-us/library/gg405479%28v=pandp.40%29.aspx – Console
Если мы не должны знать о контейнере, то как модули могут регистрировать новые общие службы? – Benjamin
Указанный 'ComposeExportedValue' является методом расширения в' System.ComponentModel.Composition.AttributedModelServices' – jan