Frage

Ich versuche Anemic Domain Modelle zu verstehen und warum sie angeblich ein anti-Muster.

Hier ist ein Beispiel aus der Praxis.

Ich habe eine Mitarbeiter-Klasse, die eine Tonne Eigenschaften hat - Namen, Geschlecht, Benutzername, usw.

public class Employee
{
    public string Name { get; set; }
    public string Gender { get; set; }
    public string Username { get; set; }
    // Etc.. mostly getters and setters
}

Als nächstes haben wir ein System, das Anruf und Website-Anfragen rotierende eingehendes Telefon beinhaltet (bekannt als ‚Leads‘) gleichmäßig auf Verkaufspersonal. Dieses System ist sehr komplex, da es Anfragen rund um robining beinhaltet, für den Urlaub Überprüfung, Mitarbeiterwünsche usw. Also das System gerade in einen Dienst getrennt aus. 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
     }
}

Dann auf der Rückseite unserer Website Anfrageformular haben wir Code wie folgt:

public void SubmitForm()
{
    var lead = CreateLeadFromFormInput();

    var selectedEmployee = Kernel.Get<IEmployeeLeadRotationService>()
                                 .SelectEmployee(lead);

    Response.Write(employee.Name + " will handle your enquiry. Thanks.");
}

Ich stoße nicht wirklich viele Probleme mit diesem Ansatz, aber angeblich ist etwas, dass ich schreiend aus laufen, weil es ist ein Anemic Domain Model .

Aber für mich ist es nicht klar, wo die Logik in dem Hauptdreh Dienst sollte gehen. Sollte es in der Führung zu gehen? Sollte es gehen in den Mitarbeitern?

Was ist mit all die injizierten Repositories etc, dass die Rotation Service erfordert - wie würden sie in die Mitarbeiter injiziert werden, da die meiste Zeit, wenn sie mit einem Mitarbeiter beschäftigen wir brauchen keine dieser Repositories

War es hilfreich?

Lösung

In diesem Fall bedeutet dies nicht ein Anemic Domain Model bilden. Ein Anemic Domain Model ist speziell über die Validierung und Transformation der Objekte . So ein Beispiel hierfür wäre, wenn eine externe Funktion, den Zustand der Mitarbeiter tatsächlich geändert oder seine Daten zu ändern.

, was in diesem Fall passiert ist, dass Sie alle Mitarbeiter nehmen und macht eine Auswahl von einer von ihnen auf ihre Informationen. Es ist schön, ein eigenes Objekt zu haben, dass untersucht andere und Entscheidungen hinsichtlich macht, was er findet. Es ist NICHT in Ordnung, ein Objekt zu haben, die verwendet wird, um ein Objekt von einem Zustand in einen anderen zu überführen.

Ein Beispiel für ein Anemic Domain Model in Ihrem Fall wäre eine externe Methode haben,

updateHours(Employee emp) // updates the working hours for the employee

, die ein Objekt Employee nimmt und aktualisiert seine Stunden für die Woche gearbeitet, um sicherzustellen, dass Fahnen angehoben werden, wenn die Stunden eine bestimmte Grenze nicht überschreiten. Das Problem dabei ist, dass, wenn Sie haben Mitarbeiter Objekte dann haben Sie keine Ahnung, wie sie ihre Stunden innerhalb der richtigen Einschränkungen zu modifizieren. In diesem Fall wird die Art und Weise, damit umzugehen wäre, die updateHours Methode in die Klasse Employee zu bewegen. Das ist der Kern des anämischen Domänenmodell anti-Musters.

Andere Tipps

Ich denke, Ihr Design ist hier in Ordnung. Wie Sie wissen, ist das anämische Domänenmodell anti-Muster ein Spiel gegen den Trend jedes Verhalten zu vermeiden, in Domänenobjekten codiert. Umgekehrt aber bedeutet es nicht, alle Verhalten zu einem Domain-Objekt bezieht, muß von diesem Objekt gekapselt werden.

Als Faustregel gilt: Verhalten, das intrinsicly an das Domain-Objekt gebunden ist und definiert ist vollständig in Bezug auf, dass eine Domain Objektinstanz in dem Domain-Objekt enthalten sein. Ansonsten zu halten Verantwortlichkeit klar, es ist am besten, um es nach außen in einem Mitarbeiter / Service wie Sie getan haben.

Es ist alles in deinem Kopf -. Betrachten Rotation Service ein Teil des Domain-Modell und das Problem löst sich zu sein

muss Rotation Informationen über viele Mitarbeiter halten, so dass es zu keinem Blei gehört, noch zu jedem einzelnen Mitarbeiter-Objekt. Es tut verdient ein Domain-Objekt in sich selbst zu sein.

Just "RotationService" zu so etwas wie "Organization.UserSupportDepartment" Umbenennung macht es offensichtlich.

Wenn Sie Ihr Domain-Modell nur Rollen und Dinge enthält, nicht Aktivitäten wie Verhalten, dann ist es anämisch. Aber ich spreche über das Verhalten in Bezug auf ein Modell nicht Objekt . Ich spreche von der Differenz zwischen ihnen in einer anderen Antwort ... https://stackoverflow.com/a/31780937/116442

Aus Ihrer Frage, Sie meine ersten beiden Bereichsanalyse Modellierungsregeln brechen: -

  1. Verhalten modelliert (aufgezeichnet) Aktivitäten stehen im Zentrum eines Domänenmodells. Fügen Sie sie zuerst.
  2. Modell Domain Aktivitäten wie Klassen, diese Methoden nicht.

würde ich eine Tätigkeit „Anfrage“ zum Modell hinzufügen. Damit hat das Modellverhalten und kann als Gruppe von Objekten ohne einen externen Controller oder ein Skript kombinieren und zu arbeiten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top