gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:42:14 26 4
gpt4 key购买 nike

我需要向我们现有的代码添加一些扩展点,并且我一直将 MEF 视为一种可能的解决方案。我们有一个 IRandomNumberGenerator 接口(interface),带有一个我们希望可交换的默认实现(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));
}
}
}

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

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

我还缺少其他方法吗?

最佳答案

目前在 MEF 中没有直接的方法来执行此操作,但 MEF 团队正在考虑在 v.Next 中对此提供支持。您本质上想要创建相同实现的多个实例,这在传统上是使用工厂模式完成的。因此,您可以使用的一种方法是:

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));
}
}
}

关于mef - 我可以使用 MEF 控制对象创建吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1027518/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com