我可以使用MEF控制对象创建吗?

Aka*_*ash 5 mef

我需要为现有代码添加一些扩展点,我一直在将MEF作为可能的解决方案.我们有一个IRandomNumberGenerator接口,我们希望可以交换默认实现(ConcreteRNG).这听起来像MEF的理想情况,但我一直遇到实例化随机数生成器的问题.我们当前的代码如下:

public class Consumer
{
    private List<IRandomNumberGenerator> generators;
    private List<double> seeds;

    public Consumer()
    {
        generators = new List<IRandomNumberGenerator>();
        seeds = new List<double>(new[] {1.0, 2.0, 3.0});

        foreach(var seed in seeds)
        {
            generators.Add(new ConcreteRNG(seed));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

换句话说,消费者负责实例化其所需的RNG,包括提供每个实例所需的种子.

我想做的是让MEF发现并实例化具体的RNG实现(使用DirectoryCatalog).我不知道如何实现这一目标.我可以公开Generators属性并将其标记为[Import],但是如何提供所需的种子?

我还缺少一些其他方法吗?

Wes*_*ard 5

目前在MEF中没有直接的方法可以做到这一点,但MEF团队正在考虑在v.Next中对此进行支持.您基本上想要创建使用Factory模式传统完成的同一实现的多个实例.所以你可以使用的一种方法是:

public interface IRandomNumberGeneratorFactory
{
  IRandomNumberGenerator CreateGenerator(int seed);
}

[Export(typeof(IRandomNumberGeneratorFactory))]
public class ConcreateRNGFactory : IRandomNumberGeneratorFactory
{
  public IRandomNumberGenerator CreateGenerator(int seed)
  {
    return new ConcreateRNG(seed);
  }
}

public class Consumer
{
  [Import(typeof(IRandomNumberGeneratorFactory))]
  private IRandomNumberGeneratorFactory generatorFactory;
  private List<IRandomNumberGenerator> generators;    
  private List<double> seeds;    

  public Consumer()    
  {
    generators = new List<IRandomNumberGenerator>();
    seeds = new List<double>(new[] {1.0, 2.0, 3.0});

    foreach(var seed in seeds)
    {            
      generators.Add(generatorFactory.CreateGenerator(seed));
    }
  }
}
Run Code Online (Sandbox Code Playgroud)