我需要爲我們現有的代碼添加一些擴展點,我一直在尋找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