MEF ComposeExportedValue vs Export attribute

本文关键字:attribute Export vs ComposeExportedValue MEF | 更新日期: 2023-09-27 17:49:30

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

模块1只有在我使用ComposeExportedValue<IMyApplication>(myApp);

时才能导入
[ModuleExport(typeof(Module1))] 
public class Module1 : IModule
{
    private readonly IRegionManager regionManager;

    [Import]
    private IMyApplication myApp;

}

我希望[Export]是足够的,但显然不是?

编辑:

我从bootstrapper中删除了public MyApplication myApp;到shell.xaml.cs(更明智),并且事情开始工作。我的结论;MEF合成正在进行中,出口根本不起作用。这就是为什么prism内部库使用ComposeExportedValue(object 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);
}

MEF ComposeExportedValue vs Export attribute

我删除了public MyApplication myApp;到shell.xaml.cs(更明智),从bootstrapper和事情得到工作。我的结论;在bootstrapper中,MEF合成正在进行中,导出根本不起作用。这就是为什么prism内部库使用ComposeExportedValue(object 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只会导出一个实例。