我很难理解为什么我们需要ComposeExportedValue(objval)而不是仅使用[Export]属性。
我拥有在shell中创建的应用程序对象,并且需要将此应用程序对象注入到prism模块中。
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));
}
}
仅当我使用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组成正在进行中,出口根本不起作用。这就是prism内部库用ComposeExportedValue(对象值)
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);
}
答案 0 :(得分:0)
我从引导程序中删除了public MyApplication myApp;
到shell.xaml.cs(更明智),事情变得有效了。我总结道;在bootstrapper MEF组合正在进行中并且导出根本不起作用。这就是prism内部库用ComposeExportedValue(对象值)
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);
}
此外,我发现ComposeExportedValue的目的之一是进行受控导出;即配置对象,设置属性等,然后导出它。否则,MEF将导出仅创建实例。