Sono nuovo di DDD e IOC / DI e sto avendo qualche problema a capire come progettare un'entità che ha bisogno di utilizzare un modello di stato per gestire il suo stato. Poiché le transizioni sono un po 'complicate, sto usando una macchina a stati finiti (FSM) per gestire gli stati (sto usando Stateless ).
Per complicare ulteriormente la situazione, l'FSM deve essere liberamente associato a un'entità. Cioè mentre so che lo stato dell'entità deve essere gestito da un FSM, non necessariamente so esattamente cosa sia l'FSM (cioè l'entità non sa quali stati / trigger / transizioni potrebbero attraversare). Gli utenti usano il termine flusso di lavoro per definire l'FSM (stato, trigger, transizioni, regole, ecc.). Il flusso di lavoro cambia indipendentemente dall'entità. Potrebbero voler aggiungere nuovi stati, cambiare regole, trigger ecc. Indipendentemente da eventuali modifiche all'entità.
Sto gestendo questo caricando dinamicamente un assembly che contiene una definizione di FSM (che implementa un'interfaccia conosciuta), quindi utilizzando un servizio che viene iniettato nell'entità, l'entità chiama il servizio e ottiene l'FSM che è utilizzando. Ciò comporta potenzialmente il caricamento di assiemi, il caching della factory che crea l'FSM e l'assegnazione dell'FSM nello stato appropriato all'entità. Infine, l'FSM può restituire l'insieme di trigger validi che possono essere forniti all'interfaccia utente in modo che uno di quei trigger possa essere selezionato e attivato. Il flusso di lavoro effettivo completamente incapsulato esternamente all'entità.
Quindi, attualmente sono la mia entità che assomiglia a qualcosa del tipo:
public class EntityUsingWorkflow
{
private readonly workflowService;
public Order(IWorkflowService service, string workflowKey, string status)
{
this.workflowService = service;
this.WorkflowKey = workflowKey;
this.Status = status;
// Note that the two lambdas are used to retrieve
// and set the state on the entity.
this.Workflow = service.GetStateMachine(workflowKey, () => this.Status, stateValue => this.Status = statValue );
}
public string WorkflowKey { get; set; }
public IStateMachine Workflow { get; private set; }
public string Status { get; private set; }
}
Sono interessato a questo design. La mia comprensione di base è che le entità di dominio non dovrebbero avere delle dipendenze iniettate in esse, ma qui ne sto iniettando una. Comprendo inoltre che l'entità deve gestire il proprio stato , quindi io È esitante spostare il flusso di lavoro completamente fuori dall'entità. Altre idee che ho avuto, come un metodo init, sposterebbero semplicemente l'iniezione sull'iniezione del metodo.
Quale sarebbe un modo pulito per progettare un'entità con questi requisiti? Va bene iniettare una dipendenza in questa situazione?