我需要为我们现有的代码添加一些扩展点,我一直在寻找MEF作为可能的解决方案。我们有一个IRandomNumberGenerator接口,并有一个默认实现(ConcreteRNG),我们希望可以交换。这听起来像是MEF的理想场景,但是我们在实例化随机数生成器方面遇到了问题。我们当前的代码如下所示:我可以使用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));
}
}
}
换句话说,消费者负责实例它所需要的随机数发生器,包括提供每个实例都需要种子。
我想要做的是让具体的RNG实现被MEF发现并实例化(使用DirectoryCatalog)。我不知道如何实现这一点。我可以公开一个Generators属性并将其标记为[Import],但是如何提供所需的种子?
有没有其他的方法我缺少?
谢谢Wes。我曾考虑过一种工厂方法,但由于我想要一个通用工厂可以创建任何由MEF发现的IRandomNumberGenerator类型的实例,所以我陷入了困境。 再次思考它,你的方法似乎不再需要额外的工作 - 再次感谢。 – Akash 2009-06-23 08:05:17
我现在正在工作。我在ConcreteRNG上提供了一个静态工厂方法来简化它: [Export(typeof(Func))] public static readonly Func Create = seed => new ConcreteRNG(seed) ; –
Akash
2009-06-23 13:48:29
是导出一个函数本身也是另一种简化的方式来获得你想要的。我也意识到,如果你想在构造函数中使用该导入,那么你需要将它作为构造函数导入,因为我演示的导入不会在对象构造之前设置。 – 2009-06-25 16:29:44