Ho un "motore logico" che esegue un insieme di passi configurati dall'utente. Questi passaggi sono salvati nel database come entità "Step". Il motore ottiene il primo passo e quindi esegue i passaggi finché non ci sono più passaggi da eseguire:
public void Execute(details, data, Step firstStep)
{
var step = firstStep;
while (null != step)
{
step = step.Execute(details, data);
}
}
I diversi tipi di passaggi sono espressi come classi derivate. Ognuno di loro deve implementare il metodo Execute. I parametri di dati e dettagli vengono utilizzati dal passaggio per eseguire una logica. Come il motore logico sa che sta solo eseguendo passo dopo passo senza sapere cosa fanno questi passaggi.
Il problema:
Alcuni passaggi devono accedere a servizi esterni per ottenere dati o anche lo stesso database o lo stesso database in cui sono archiviate le entità di passaggio effettive. Le informazioni sono solitamente utilizzate da altri passaggi. Si potrebbe dire che alcuni dei passaggi sono solo per il caricamento di dati da fonti esterne / database e altri passaggi stanno usando tali dati per prendere decisioni. Questa separazione viene eseguita in modo da poter utilizzare diverse origini dati (purché producano lo stesso tipo di output) senza la necessità di scrivere alcun codice aggiuntivo.
C'è un modo migliore per gestire questo tipo di dominio? Se separo l'attuale Step e la logica (ovvero caricando i dati dal servizio esterno o dal database), allora il mio intero modello di dominio (passaggi) non ha alcuna logica. Molto probabilmente avrei qualcosa di simile:
var handler = dictionary[step];
handler.Execute(step, details, data);
Ora la logica e tutte le dipendenze esterne sono nell'oggetto gestore ma l'oggetto dominio effettivo (passo) è solo un fittizio segnaposto per le informazioni. Anche questo non sembra corretto.