我需要为现有代码添加一些扩展点,我一直在将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],但是如何提供所需的种子?
我还缺少一些其他方法吗?
目前在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)
| 归档时间: |
|
| 查看次数: |
4112 次 |
| 最近记录: |