Próbuję zrozumieć Anemiczne Modele Domeny i dlaczego są one rzekomo anty-wzorem.Unikanie anemicznego modelu domeny - prawdziwy przykład
Oto przykład z prawdziwego świata.
Mam klasy pracownika, który ma mnóstwo właściwości - nazwa, płeć, nazwa użytkownika, itp
public class Employee
{
public string Name { get; set; }
public string Gender { get; set; }
public string Username { get; set; }
// Etc.. mostly getters and setters
}
Następnie mamy system, który obejmuje obracanie przychodzących połączeń telefonicznych i zapytań stronie internetowej (znane jako „potencjalnych ") równomiernie wśród sprzedawców. Ten system jest dość złożony, ponieważ obejmuje zapytania o zaokrąglanie robót, sprawdzanie świąt, preferencji pracowników itp. Tak więc ten system jest obecnie podzielony na usługę: 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
}
}
Następnie na tylnej stronie naszego formularza zapytania mamy kodu:
public void SubmitForm()
{
var lead = CreateLeadFromFormInput();
var selectedEmployee = Kernel.Get<IEmployeeLeadRotationService>()
.SelectEmployee(lead);
Response.Write(employee.Name + " will handle your enquiry. Thanks.");
}
Naprawdę nie napotkać wiele problemów z tym podejściem, ale podobno jest to coś, co powinno uruchomić krzycząc, ponieważ jest to model domeny anemicznej Anemic Domain Model.
Ale dla mnie nie jest jasne, gdzie powinna iść logika w usłudze obrotu ołowiu. Czy powinien pójść na czele? Czy powinien iść do pracownika?
Co ze wszystkimi wstrzykniętymi repozytoriami itp., Których wymaga usługa rotacji - w jaki sposób zostałyby one wstrzyknięte pracownikowi, zważywszy, że przez większość czasu w kontaktach z pracownikiem nie potrzebujemy żadnego z tych repozytoriów?
+1 świetne pytanie! – mdma
Więc jak wygląda "ILead", jeśli nie jest oczywiste, aby umieścić w nim .SelectEmployee()? –
Cóż, główną przyczyną w tym przypadku jest zapytanie w sieci, więc będzie mieć właściwość Komentarze itp. Ale mamy również zapytania telefoniczne, aplikacje, cytaty itp., Które są nieco inne. Interfejs ILead miałby właściwości takie jak LocationOfLead, TimeOfLead itp. – cbp