MEF ComposeExportedValue vs Export属性

时间:2015-05-18 13:02:08

标签: c# dependency-injection prism mef prism-5

我很难理解为什么我们需要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);

时,模块1才能导入
[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);
}

1 个答案:

答案 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将导出仅创建实例。