Estoy tratando de mejorar con IoC, DI y OOD para una mejor capacidad de prueba y un acoplamiento más flexible.OOD usando contenedores IoC: ¿cómo construir objetos dependientes?
modo que cuando diseñamos clases con un uso intensivo de la COI y DI podemos endup con clases con múltiples dependencias, por ejemplo
class Processor
{
private IService1 m_Service1;
private IService2 m_Service2;
private IService3 m_Service3;
//approach 1
public Processor(IService1 service1, IService2 service2, IService3 service3)
{
m_Service1 = service1;
m_Service2 = service2;
m_Service3 = service3;
}
//approach 2
public Processor(IContainer container)
{
m_Service1 = container.Resolve<IService1>();
m_Service2 = container.Resolve<IService2>();
m_Service3 = container.Resolve<IService3>();
}
//approach 3
public delegate Processor Factory();
}
Im pensando en lo que debería ser el enfoque habitual aquí. Podemos dejar constructor con 3 parámetros, pero si estamos construyendo aplicación usando autofac (por ejemplo) más probable es que rara vez se utilizarán otras que por resolver los tipos de alguna instancia del contenedor como
Processor proc = new Processor(
container.Resolve<IService1>(),
container.Resolve<IService2>(),
container.Resolve<IService3>());
así que estoy pensando que tal enfoque 2 es mejor, cuando dependemos de múltiples tipos desde el contenedor. De todos modos, tendremos que agregar una referencia a autofac en algún lugar, por lo que hay razones para no hacerlo ahora?
Autofac también proporciona enfoque método de fábrica delegado
http://code.google.com/p/autofac/wiki/DelegateFactories
var processorFactory = container.Resolve<Processor.Factory>();
Processor processor = processorFactory.Invoke();
Así también hemos acercarse 3 - no vamos a utilizar constructores para crear nuestras instancias de clases, en lugar estaremos llamando delegado resuelto a partir de contenedores y resolverá las dependencias para nosotros.
Como soy bastante nuevo en IoC es difícil decir cuándo deberíamos usar 1,2,3. Ellos tienen ventajas y desventajas.
Creo que, en general, si la clase tiene 1 dependencia, probablemente siempre podamos usar el enfoque 1 ... aparte de eso, no estoy seguro de qué elegir y cuándo.
ACTUALIZACIÓN He leído sobre el servicio de localizador contra patrón, pero he llegar a cuarto (o verdadera tercera aproximación)
está cerca de ServiceLocator excepto que no es, se pasa un objeto que se parece a esto
public class ServiceLocatorObject
{
private IService1 m_Service1;
private IService2 m_Service2;
private IService3 m_Service3;
public IService1 Service1 {get {return m_Service1;}}
public IService2 Service2 {get {return m_Service2;}}
public IService3 Service3 {get {return m_Service3;}}
public ServiceLocatorObject(IService1 service1, IService2 service2, IService3 service3)
{
m_Service1 = service1;
m_Service2 = service2;
m_Service3 = service3;
}
}
Y ahora creamos
//approach 4
public Processor(ServiceLocatorObject servicesToUse)
{
m_Services = servicesToUse;
}
ahora hemos desacoplado nuestra clase de implementaciones de servicios de una Está claro qué dependencias reales necesita (si suponemos que se requieren todos los servicios disponibles en el objeto pasado) porque no estamos pasando un contenedor que puede contener 100 implementaciones. Y ese objeto se puede incluso reutilizar si esa combinación de servicios 3 puede ser requerida en alguna otra clase en nuestra aplicación. Entonces, estamos usando el constructor DI no el patrón ServiceLocator. la interfaz es clara y no está sobrecargada de dependencias, la nueva clase podría ser un buen candidato para la reutilización.
¿Qué dirías sobre este?
enlace es bueno, ese libro se ve exactamente lo que necesito. ¿Qué piensas sobre el tercer enfoque? –
+1 Consulte mi respuesta para más comentarios. –
Uso el tercer enfoque en todo mi código ... cuando necesito inyectar un medio para crear muchas instancias de un tipo a lo largo del tiempo. Yo uso Windsor ... así que uso mucho las fábricas de delegados e inyecto Func cuando sé que mi procesador necesitará crear muchos IService1s a lo largo del tiempo ... –
Jeff