Potrzebuję dodać kilka punktów rozszerzeń do naszego istniejącego kodu i szukałem MEF jako możliwego rozwiązania. Mamy interfejs IRandomNumberGenerator z domyślną implementacją (ConcreteRNG), którą chcielibyśmy zamienić. Brzmi to jak idealny scenariusz dla MEF, ale mam problemy ze sposobem tworzenia instancji generatorów liczb losowych. Nasz aktualny kod wygląda następująco:Czy mogę kontrolować tworzenie obiektów za pomocą 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));
}
}
}
Innymi słowy, gdy konsument jest odpowiedzialny za utworzenie wystąpienia RNGs potrzebuje, w tym zapewnienie, że każde ziarno instancja wymaga.
Chciałbym, aby konkretna implementacja RNG została odkryta i utworzona przez MEF (przy użyciu katalogu DirectoryCatalog). Nie jestem pewien, jak to osiągnąć. Mogę narazić własność Generatorów i oznaczyć ją jako [Import], ale jak mam dostarczyć wymagane nasiona?
Czy istnieje inne podejście, którego mi brakuje?
Dzięki Wes. Zastanawiałem się nad podejściem fabrycznym, ale utknąłem z powodu faktu, że chciałem generyczną fabrykę, która stworzyła instancję dowolnego typu IRandomNumberGenerator odkrytego przez MEF. Myśląc o tym jeszcze raz, twoje podejście nie wydaje się zbyt dużą ilością pracy - jeszcze raz dziękuję. – Akash
Mam to teraz działa. Uprośniłem to nieco, dostarczając statyczną metodę fabryczną na ConcreteRNG: [Eksport (typeof (Func))] public static readonly Func Create = seed => new ConcreteRNG (seed) ; –
Akash
Tak, eksportuj samą funkcję, to także inny uproszczony sposób na uzyskanie tego, co chcesz. Zauważyłem też, że jeśli chcesz użyć tego importu w konstruktorze, musisz uczynić go importem konstruktora, ponieważ ten import, jak pokazałem, nie zostanie ustawiony przed budową obiektu. –