Sto cercando di capire i modelli di dominio anemico e il motivo per cui si suppone siano un anti-modello.Evitare il modello di dominio anemico - un esempio reale
Ecco un esempio reale.
Ho un classe Employee, che ha un sacco di proprietà - nome, sesso, nome utente, ecc
public class Employee
{
public string Name { get; set; }
public string Gender { get; set; }
public string Username { get; set; }
// Etc.. mostly getters and setters
}
successivo abbiamo un sistema che coinvolge a rotazione le chiamate in arrivo e richieste di informazioni del sito web (noto come 'lead ') uniformemente tra il personale di vendita. Questo sistema è piuttosto complesso in quanto prevede richieste di round-robining, controllo delle vacanze, preferenze dei dipendenti, ecc. Quindi questo sistema è attualmente separato in un servizio: 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
}
}
Poi sul retro del nostro modulo di richiesta web abbiamo codice come questo:
public void SubmitForm()
{
var lead = CreateLeadFromFormInput();
var selectedEmployee = Kernel.Get<IEmployeeLeadRotationService>()
.SelectEmployee(lead);
Response.Write(employee.Name + " will handle your enquiry. Thanks.");
}
Non mi incontrano molti problemi con questo approccio, ma presumibilmente questo è qualcosa che avrei dovuto correre urlando perché è un modello di dominio anemico .
Ma per me non è chiaro dove dovrebbe andare la logica nel servizio di rotazione di piombo. Dovrebbe andare in testa? Dovrebbe andare nel dipendente?
E che dire di tutti i repository iniettati ecc. Che il servizio di rotazione richiede - come verrebbero iniettati nel dipendente, dato che la maggior parte delle volte quando ci occupiamo di un dipendente non abbiamo bisogno di nessuno di questi repository?
+1 ottima domanda! – mdma
Quindi, come appare un 'ILead', se non è ovvio inserire .SelectEmployee() in esso? –
Beh, in questo caso il lead è un'inchiesta web, quindi avrà una proprietà Comments, ecc. Ma abbiamo anche richieste telefoniche, applicazioni, preventivi ecc. Che sono tutti leggermente diversi. L'interfaccia di ILead avrebbe proprietà come LocationOfLead, TimeOfLead ecc. – cbp