2015-05-18 27 views
0

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

我更习惯于将模块注入到shell中,而不是反过来。您确定要将外壳注入模块吗? – Kryptos

+0

谢谢你的建议。除棱镜模块外,我还有小型模块化业务应用程序对象。每个棱镜模块都需要将自己的小型商业应用程序模块/对象注册到壳体中的主要业务应用程序。我发现向Prism模块发送一个有限的接口(仅用于注册业务对象)会更容易。 Prism模块通过此提供的界面向主业务应用程序注册其自己的业务模块。除此以外;我必须将所有业务模块导出/发送到shell,而且看起来不会让事情变得更简单。 – freewill

回答

0

我删除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); 
} 

而且我发现的宗旨,为ComposeExportedValue是使受控的出口之一;即配置对象,设置属性等,然后导出它。否则,MEF会导出刚创建的实例。