Estamos construyendo un proyecto ASP.NET y encapsulando toda nuestra lógica comercial en clases de servicio. Algunos están en los objetos de dominio, pero en general son bastante anémicos (debido al ORM que estamos usando, eso no cambiará). Para habilitar mejor las pruebas unitarias, definimos interfaces para cada servicio y utilizamos D.I.E. Aquí hay un par de las interfaces:¿Por qué no agrupar todas las clases de servicio en un método de fábrica (en lugar de inyectar interfaces)?
IEmployeeService
IDepartmentService
IOrderService
...
Todos los métodos de estos servicios son básicamente grupos de tareas, y las clases no contienen variables miembro privadas (excepto las referencias a los servicios dependientes). Antes de preocuparnos por Unit Testing, simplemente declararíamos todas estas clases como estáticas y las llamaríamos directamente. Ahora vamos a configurar la clase de este tipo si el servicio depende de otros servicios:
public EmployeeService : IEmployeeService
{
private readonly IOrderService _orderSvc;
private readonly IDepartmentService _deptSvc;
private readonly IEmployeeRepository _empRep;
public EmployeeService(IOrderService orderSvc
, IDepartmentService deptSvc
, IEmployeeRepository empRep)
{
_orderSvc = orderSvc;
_deptSvc = deptSvc;
_empRep = empRep;
}
//methods down here
}
Esto realmente no suele ser un problema, pero me pregunto por qué no creó una clase de fábrica que se pasa alrededor de su lugar?
decir
public ServiceFactory
{
virtual IEmployeeService GetEmployeeService();
virtual IDepartmentService GetDepartmentService();
virtual IOrderService GetOrderService();
}
Entonces, en lugar de llamar a:
_orderSvc.CalcOrderTotal(orderId)
que llamaríamos
_svcFactory.GetOrderService.CalcOrderTotal(orderid)
¿Cuál es la caída de este método? Todavía es comprobable, todavía nos permite usar D.I. (y manejar dependencias externas como contextos de bases de datos y remitentes de correo electrónico a través de D.I. dentro y fuera de la fábrica), y elimina una gran cantidad de D.I. configurar y consolida dependencias más.
Gracias por su opinión!
"No es una buena idea, ya que esas clases tendrán acceso a objetos que no necesitan y no tienen nada que ver con y algunos programadores siempre llaman al código que se supone que no deben llamar solo porque está disponible ". - Buen punto, marcando esto como la respuesta. – Andrew