Consideremos el siguiente ejemplo simplificado:DDD - transición de estado Entidad
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;
}
El Estado de clase se utiliza directamente en el billete objeto de dominio. Más adelante en el ciclo de vida del ticket, podrían establecerse otros estados.
El ticket se conserva en una tabla de entradas, así como también en TicketState. Entonces, dentro del DB, el ticket tendrá una clave externa para la tabla de estado del ticket.
Cuando establezco el estado apropiado dentro de mi entidad, ¿cómo cargo la instancia de estado desde la base de datos? ¿Tengo que inyectar un repositorio en la entidad? ¿Necesito usar un marco como castillo para este caso? ¿O hay mejores soluciones, tal vez pasar el estado desde el exterior?
public class Ticket
{
//...
public ITicketStateRepository stateRep; //<-- inject
public Ticket()
{
State = stateRep.GetById(NEW_STATE_ID);
}
//...
}
¿Existe alguna práctica recomendada? Hasta ahora no he usado ningún marco de inyección de dependencias o nada y seguí cualquier cosas persistencia de mi dominio ..
Otra approch:
public class Ticket
{
//...
public Ticket(NewTicketState newTicketState)
{
State = newTicketState;
}
public void Finished(FinishedTicketState finishedTicketState)
{
State = finishedTicketState;
}
//...
}
+1 para la persistencia ignorant objects. El hecho de que el modelo de dominio haya sido contaminado con objetos de repositorio no significa que no sea anémico, de hecho, podría ocultar lugares donde los objetos de dominio no están soportando su peso. –
Gracias, pero tal vez mi pregunta no fue lo suficientemente clara. Estaba preguntando cómo configurar la entidad de estado apropiada cuando, por ejemplo, el ticket se instaura o su estado cambia. ¿Puedes publicar un ejemplo sobre cómo resolverías el problema anterior? – Chris
El estado de instanciación es bastante fácil: debe ser NUEVO. Algo tiene que estar orquestando eventos para cambiar su estado. Normalmente lo llamo un servicio porque implementa un caso de uso particular. Poseerá una instancia del repositorio, que usará para instanciar un nuevo Ticket o leer uno existente, cambiar su estado para satisfacer el caso de uso, persistir el nuevo estado como una sola unidad de trabajo y finalizar el uso. caso. – duffymo