我很难理解为什么我们需要ComposeExportedValue(objval)而不是仅仅使用[Export]属性。MEF ComposeExportedValue vs Export属性
我有一个在shell中创建的应用程序对象,这个应用程序对象需要注入到棱镜模块。
public class ShellBootsrapper : MefBootstrapper
{
[Export(typeof(IMyApplication))]
public MyApplication myApp;
protected override DependencyObject CreateShell()
{
this.Container.ComposeExportedValue<IMyApplication>(myApp);
return this.Container.GetExportedValue<Shell>();
}
protected override void ConfigureAggregateCatalog()
{
base.ConfigureAggregateCatalog();
myApp = new MyApplication();
this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(System.Reflection.Assembly.GetExecutingAssembly()));
this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(Module1.Module1).Assembly));
}
}
模块1可以导入只有当我使用ComposeExportedValue<IMyApplication>(myApp);
[ModuleExport(typeof(Module1))]
public class Module1 : IModule
{
private readonly IRegionManager regionManager;
[Import]
private IMyApplication myApp;
}
我会期待[出口]就足够了,但显然不是?
编辑: 我删除public MyApplication myApp;
到shell.xaml.cs(更明智的),从引导程序和得到的东西的工作。我总结说; MEF组成正在进行中,出口根本不起作用。这就是为什么棱镜内部的lib做与ComposeExportedValue(对象VAL)出口
protected virtual void RegisterBootstrapperProvidedTypes()
{
this.Container.ComposeExportedValue<ILoggerFacade>(this.Logger);
this.Container.ComposeExportedValue<IModuleCatalog>(this.ModuleCatalog);
this.Container.ComposeExportedValue<IServiceLocator>(new MefServiceLocatorAdapter(this.Container));
this.Container.ComposeExportedValue<AggregateCatalog>(this.AggregateCatalog);
}
我更习惯于将模块注入到shell中,而不是反过来。您确定要将外壳注入模块吗? – Kryptos
谢谢你的建议。除棱镜模块外,我还有小型模块化业务应用程序对象。每个棱镜模块都需要将自己的小型商业应用程序模块/对象注册到壳体中的主要业务应用程序。我发现向Prism模块发送一个有限的接口(仅用于注册业务对象)会更容易。 Prism模块通过此提供的界面向主业务应用程序注册其自己的业务模块。除此以外;我必须将所有业务模块导出/发送到shell,而且看起来不会让事情变得更简单。 – freewill