Necesito agregar algunos puntos de extensión a nuestro código existente, y he estado viendo a MEF como una posible solución. Tenemos una interfaz IRandomNumberGenerator, con una implementación predeterminada (ConcreteRNG) que nos gustaría ser intercambiables. Esto suena como un escenario ideal para MEF, pero he estado teniendo problemas con la forma en que instanciamos los generadores de números aleatorios. Nuestro código actual se parece a:¿Puedo controlar la creación de objetos usando 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));
}
}
}
En otras palabras, el consumidor es responsable de instanciar los generadores de números aleatorios que necesita, incluyendo el suministro de la semilla que cada caso requiere.
Lo que me gustaría hacer es tener la implementación concreta de RNG descubierta e instanciada por MEF (usando DirectoryCatalog). No estoy seguro de cómo lograr esto. Podría exponer una propiedad de Generators y marcarla como [Importar], pero ¿cómo proporciono las semillas requeridas?
¿Hay algún otro enfoque que me falta?
Gracias Wes. Había considerado un enfoque de fábrica, pero me había atascado debido al hecho de que quería una fábrica genérica que creara una instancia de cualquier tipo IRandomNumberGenerator que fuera descubierto por MEF. Pensando de nuevo, su enfoque no parece mucho trabajo extra, gracias de nuevo. – Akash
Lo tengo trabajando ahora. Lo simplifiqué un poco al proporcionar un método de fábrica estático en ConcreteRNG: [Exportar (typeof (Func))] public static readonly Func Create = seed => new ConcreteRNG (seed) ; –
Akash
Sí exportar una función en sí misma es también otra forma simplificada de obtener lo que desea. También me acabo de dar cuenta de que si quieres usar esa importación dentro del constructor, entonces necesitarás hacer una importación de constructor, porque esa importación como lo demostré no se establecería antes de la construcción del objeto. –