¿Este ejemplo de servicio de repositorio de entidades se ajusta al diseño basado en dominio?
-
19-08-2019 - |
Pregunta
Me gustaría saber si encuentra significativo el siguiente patrón en el diseño controlado por dominio.
La capa de dominio consta de modelo y repositorio. La capa de aplicación consta de servicios que manejan consultas desde la interfaz de usuario o desde controladores en el patrón Modelo-Vista-Controlador.
Detalles de la estructura:
// 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; } }
En particular, ¿tendría sentido mover el método a la clase de entidad Frase? En ese caso, ¿cómo se llamaría eso?
EDITAR:
El ejemplo anterior se ha modificado después de la respuesta de moffdub y el comentario de Adeel Ansari. Los cambios están resaltados .
Me gustaría preguntar sobre el IPhraseRepository.GetPhrase (fraseId) agregado y cómo incluiría eso.
Solución
El repositorio debe incluir una Frase, no una cadena. Tampoco estoy seguro de por qué el método SavePhrase devuelve una Frase. Tiendo a hacer que tales métodos sean nulos.
Además, tenga cuidado de hacer que cada propiedad en su modelo de dominio tenga captadores y establecedores públicos. Eso puede llevarlo a un modelo de dominio anémico.
Otros consejos
Solo algunas ideas:
SetId (int fraseId) no debe ser público
Phrase podría implementar IPhrase (o IPhraseAggregate) que no expondría SetId (..)
SavePhrase (Frase de frase) podría (debería?) volverse nulo si la referencia a la entidad de frase permanece "válida" después de guardar:
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
}