Questo esempio di servizio di repository di entità si adatta alla progettazione basata su dominio?
-
19-08-2019 - |
Domanda
Vorrei sapere se il seguente schema è significativo nella progettazione guidata dal dominio.
Il livello di dominio è costituito da modello e repository. Il livello applicazione è costituito da servizi che gestiscono le query dall'interfaccia utente o dai controller nel modello Model-View-Controller.
Dettagli della struttura:
// Assembly Model: public class Phrase { public int PhraseId { get; private set; } public string PhraseText { get; private set; } public Phrase(string phraseText) { this.PhraseText = phraseText; } public void SetId(int phraseId) { this.PhraseId = phraseId; } } // Assembly Repository (references assembly Model): public interface IPhraseRepository { Phrase SavePhrase(Phrase phrase); Phrase GetPhrase(int phraseId); } // Assembly Services (references assemblies Model and Repository): public class PhraseService { private IPhraseRepository _phraseRepository; public PhraseService(IPhraseRepository phraseRepository) { _phraseRepository = phraseRepository; } public Phrase SavePhrase(string phraseText) { Phrase phrase = _phraseRepository.SavePhrase(new Phrase(phraseText)); // doing other things like sending mail, logging, etc. // ... return Phrase; } }
In particolare, avrebbe senso spostare il metodo nella classe di entità frase? In tal caso, come si chiamerebbe?
EDIT:
L'esempio sopra è stato modificato dopo la risposta di moffdub e il commento di Adeel Ansari. Le modifiche sono evidenziate .
Vorrei chiedere informazioni sull'IPhraseRepository.GetPhrase aggiunto (fraseId) e su come lo includeresti?
Soluzione
Il repository dovrebbe contenere una frase, non una stringa. Inoltre, non sono sicuro del motivo per cui il metodo SavePhrase restituisce una frase. Tendo a rendere tali metodi nulli.
Inoltre, fai attenzione a rendere tutte le proprietà nel tuo modello di dominio con getter e setter pubblici. Ciò può condurti a un modello di dominio anemico.
Altri suggerimenti
Solo alcuni pensieri:
SetId (int phraseId) non dovrebbe essere pubblico
La frase potrebbe implementare IPhrase (o IPhraseAggregate) che non esponeva SetId (..)
SavePhrase (Frase frase) potrebbe (dovrebbe?) restituire un valore nullo se il riferimento all'entità frase rimane " valido " dopo il salvataggio:
public void SavePhrase(string phraseText)
{
Phrase phrase = new Phrase(phraseText); // NOTE: keep a reference to phrase
this._phraseRepository.SavePhrase(phrase); // NOTE: returns void
return phrase; // NOTE: assume the repository sets the phrase.PhraseId
}