Estoy tratando de comprender los Modelos de Dominio Anemico y por qué son supuestamente un antipatrón.Evitando el modelo de dominio anémico - un ejemplo real
Aquí hay un ejemplo del mundo real.
que tienen una clase de empleados, que tiene un montón de propiedades - nombre, sexo, nombre de usuario, etc.
public class Employee
{
public string Name { get; set; }
public string Gender { get; set; }
public string Username { get; set; }
// Etc.. mostly getters and setters
}
A continuación tenemos un sistema que implica la rotación de las llamadas telefónicas entrantes y consultas sitio web (conocidos como 'pistas ') uniformemente entre el personal de ventas. Este sistema es bastante complejo ya que involucra consultas de rutina, verificación de vacaciones, preferencias de los empleados, etc. Por lo tanto, este sistema está actualmente separado en un servicio: EmployeeLeadRotationService.
public class EmployeeLeadRotationService : IEmployeeLeadRotationService
{
private IEmployeeRepository _employeeRepository;
// ...plus lots of other injected repositories and services
public void SelectEmployee(ILead lead)
{
// Etc. lots of complex logic
}
}
A continuación, en la parte trasera de nuestro formulario de consulta web que tienen un código como éste:
public void SubmitForm()
{
var lead = CreateLeadFromFormInput();
var selectedEmployee = Kernel.Get<IEmployeeLeadRotationService>()
.SelectEmployee(lead);
Response.Write(employee.Name + " will handle your enquiry. Thanks.");
}
Realmente no encuentro muchos problemas con este enfoque, pero se supone que esto es algo que debería funcionar gritando porque es Anemic Domain Model.
Pero para mí no está claro a dónde debe ir la lógica del servicio de rotación principal. ¿Debería ir a la cabeza? ¿Debería ir en el empleado?
¿Qué pasa con todos los repositorios inyectados, etc. que requiere el servicio de rotación? ¿Cómo se inyectarían en el empleado, dado que la mayoría de las veces al tratar con un empleado no necesitamos ninguno de estos repositorios?
+1 gran pregunta! – mdma
Entonces, ¿cómo se ve un 'ILead', si no es obvio poner .SelectEmployee() en él? –
Bueno, el plomo en este caso es una consulta web, por lo que tendrá una propiedad de comentarios, etc. Pero también tenemos consultas telefónicas, aplicaciones, presupuestos, etc. que son ligeramente diferentes. La interfaz de ILead tendría propiedades como LocationOfLead, TimeOfLead, etc. – cbp