Creo que no corresponde a Prism o MEF, sino al principio de Dependency Injection y las mejores prácticas en general. (Sí, anudé que MEF no es contenedor DI, pero aquí se usa casi como contenedor DI, así que supongo que usaré las mismas prácticas aquí).
En las mejores prácticas de DI (this libro es muy bueno, lo recomiendo) que es bueno tener este tipo de pasos de "flujo de trabajo" DI:
- registro de todos los tipos necesarios (en Prisma - por programa previo. (método))
- objeto raíz determinación ConfigureCatalog (con todos los objetos anidados En Prisma -. por Bootstrapper.CreateShell() método)
- utilizar su objeto raíz
- versión que objeto raíz
Idealmente, NO deberías usar el contenedor DI nunca más. Su código NO debe saber sobre la existencia del contenedor DI (de este lado, Unity es realmente un contenedor DI, porque puede escribir un código que no sabrá sobre el uso del contenedor DI). Si tu código lo sabe, DEPENDE de un contenedor DI, y es malo.
PS.Si desea utilizar contenedores MEF en su módulo de todos modos (por ejemplo, porque no está muy familiarizado con el paradigma DI o si tiene algunas tareas muy específicas), se puede intentar algo como:
[ModuleExport(typeof(YourModule))]
public class YourModule : IModule
{
public static CompositionContainer CompositionContainer;
[ImportingConstructor]
public void YourModule(CompositionContainer container)
{
this.CompositionContainer = container;
}
}
no hacer olvide registrar su contenedor MEF en su Boostrapper:
public class YourBootstrapper: MefBootstrapper
{
protected override CompositionContainer CreateContainer()
{
var container = base.CreateContainer();
container.ComposeExportedValue(container);
return container;
}
}
Aunque estoy de acuerdo con las mejores prácticas, la documentación del prisma establece claramente que también puede utilizar el método Initialize de su método para "Registrar servicios compartidos con el contenedor de inyección de dependencias de la aplicación". http://msdn.microsoft.com/en-us/library/gg405479%28v=pandp.40%29.aspx – Console
Si no se supone que debemos saber sobre el contenedor, ¿cómo pueden los módulos registrar nuevos servicios compartidos? – Benjamin
El 'ComposeExportedValue' mencionado es un método de extensión en' System.ComponentModel.Composition.AttributedModelServices' – jan