betrachten Sie das folgende vereinfachte Beispiel:DDD - Entity Zustandsübergang
public class Ticket
{
public int Id;
public TicketState State;
public Ticket()
{
// from where do I get the "New" state entity here? with its id and name
State = State.New;
}
public void Finished()
{
// from where do I get the "Finished" state entity here? with its id and name
State = State.Finished;
}
}
public class TicketState
{
public int Id;
public string Name;
}
Die Klasse Zustand direkt innerhalb des Domain-Objekt-Ticket verwendet wird. Später im Lebenszyklus des Tickets könnten andere Zustände eingestellt sein.
Das Ticket wird in einer Ticket-Tabelle sowie in TicketState gespeichert. Innerhalb der DB hat das Ticket also einen Fremdschlüssel für die Ticketstatus-Tabelle.
Wenn ich den entsprechenden Status innerhalb meiner Entity festlege, wie lade ich die State-Instanz aus der DB? Muss ich ein Repository in die Entität einfügen? Muss ich für solche Fälle ein Framework wie Castle verwenden? Oder gibt es bessere Lösungen, vielleicht den Staat von außen?
public class Ticket
{
//...
public ITicketStateRepository stateRep; //<-- inject
public Ticket()
{
State = stateRep.GetById(NEW_STATE_ID);
}
//...
}
Gibt es Best Practices? Bisher habe ich keinen Dependency Injection-Framework oder irgendetwas verwenden und hielt keine Persistenz Dinge aus meiner Domain ..
Another approch:
public class Ticket
{
//...
public Ticket(NewTicketState newTicketState)
{
State = newTicketState;
}
public void Finished(FinishedTicketState finishedTicketState)
{
State = finishedTicketState;
}
//...
}
+1 für persistente ignorante Objekte. Nur weil das Domänenmodell mit Repository-Objekten verschmutzt wurde, heißt das nicht, dass es nicht anämisch ist - es könnte sogar Orte verbergen, an denen Domain-Objekte nicht ihr Gewicht tragen. –
Danke, aber vielleicht war meine Frage nicht klar genug. Ich fragte, wie man die entsprechende Statuseinheit einstellt, wenn z.B. Das Ticket wird instanziiert oder sein Status wird geändert. Können Sie ein Beispiel veröffentlichen, wie Sie das obige Problem lösen könnten? – Chris
Der Instantiierungszustand ist einfach genug: Es sollte NEU sein. Etwas muss Events orchestrieren, um seinen Zustand zu ändern. Ich nenne es normalerweise einen Dienst, weil es einen bestimmten Anwendungsfall implementiert. Es besitzt eine Instanz des Repositorys, mit der es entweder ein neues Ticket instanziiert oder ein bestehendes liest, seinen Status ändert, um den Anwendungsfall zu erfüllen, den neuen Status als einzelne Arbeitseinheit beizubehalten und die Verwendung zu beenden Fall. – duffymo