c# - MEF - 我可以创建实例并让它们在 MEF 内自动组合吗?

标签 c# .net mef .net-4.0

据我所知,为了使导入/导出属性相互正确连接,我必须对具有这些属性的每个新实例调用 compositionContainerInstance.Compose(...)

是否可以自动发生这种情况,这样我就不必在每次创建某个可组合类的新实例时都这样做?

这将是一个例子,虽然很长,但它抽象了我遇到的问题。

public class Worker1
{
    [Import(typeof(IDataProvider))]
    public IDataProvider DataProvider;

    public Worker2 second;
    //use data provider to perform logic
}

public class Worker2
{
    [Import(typeof(IDataProvider))]
    public IDataProvider DataProvider;

    //use data provider to perform logic
}

[Export(typeof(IDataProvider))]
public class GeoDataProvider : IDataProvider
{
    //implements logic
}

public class Container
{
    private Worker1 t1;
    public void Init()
    {
        AggregateCatalog cat = new AggregateCatalog();
        cat.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly()));
        cat.Catalogs.Add(new DirectoryCatalog("."));

        CompositionContainer c = new CompositionContainer(cat);
        c.ComposeParts(new GeoDataProvider(), this);
    }

    public void PerformLogic()
    {
        t1 = new Worker1;
        //here it fails because I need c.ComposeParts(t1):
        t1.DoSomethingWithProvider();
        //but even if I do c.ComposeParts(t1), still the t1.second.DataProvider will be null
        //how to avoid this?
    }
}

我希望有一种方法可以自由创建 Worker1/Worker2 的新实例,而无需知道它们必须在使用前组合。可行吗?

最佳答案

必须有人知道他们需要镇定。

如果您要自由创建 Worker1 和 Work2 实例而不是让 MEF 创建它们,那么您还必须给 MEF 一个机会来满足新实例的导入,或者正如您所发现的,IDataProvider 字段永远不会被填充出。

这是一个示例,您只需让 MEF 根据需要创建类。只需一次“ComposeParts”调用即可完成所有设置。

[Export]
public class Worker1
{
  [Import]
  public IDataProvider DataProvider;

  [Import]
  public Worker2 second;

  //use data provider to perform logic
  public void DoSomethingWithProvider() {
    }
}

[Export]
public class Worker2
{
  [Import]
  public IDataProvider DataProvider;

  //use data provider to perform logic
}

[Export( typeof( IDataProvider ) )]
public class GeoDataProvider : IDataProvider
{
  //implements logic
}

public class Container
{
  [Import]
  private Worker1 t1;

  public void Init()
  {
    AggregateCatalog cat = new AggregateCatalog();
    cat.Catalogs.Add( new AssemblyCatalog( Assembly.GetExecutingAssembly() ) );
    cat.Catalogs.Add( new DirectoryCatalog( "." ) );

    CompositionContainer c = new CompositionContainer( cat );
    c.ComposeParts( this );
  }

  public void PerformLogic()
  {
    t1.DoSomethingWithProvider();
  }
}

关于c# - MEF - 我可以创建实例并让它们在 MEF 内自动组合吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4441074/

相关文章:

c# - 从左到右读取对象

c# - 为 HTML5 从设备中的线路创建实时音频流

Linux下C#,Process.Start()异常 "No such file or directory"

.net - .NET 中的两个有向列表枚举器

c# - 具有 WPF ListView 的 MouseOver 大纲

.net - 如何在没有导出属性的情况下在 MEF 中导出类型? (例如以编程方式)

wcf - 如何告诉 MEF 重新创建对象?

c# - 调用基础构造函数不工作 c#

c# - 处理从 C++/MFC 应用程序中的 .NET dll 抛出的异常

C# MEF 与静态类的用法