Será que este exemplo ajuste Entidade Repository Serviço em Domain-Driven Design?
-
19-08-2019 - |
Pergunta
Gostaria de saber se você encontrar o seguinte padrão significativo no domínio driven design.
A camada de domínio consiste de modelo e repositório. A camada de aplicação consiste em serviços que lida com consultas a partir da interface do usuário, ou de controladores no padrão Model-View-Controller.
Detalhes da estrutura:
// 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; } }
Em particular, faria sentido para mover o método para a classe de entidade frase? Nesse caso, como teria que ser chamado?
EDIT:
O exemplo acima foi modificado após a resposta do moffdub e o comentário de Adeel Ansari. As mudanças são destacada .
Eu gostaria de perguntar sobre a IPhraseRepository.GetPhrase adicionado (phraseId) e como você incluiria isso?
Solução
O repositório deve tomar em uma frase, não uma string. Eu também não sei por que o método SavePhrase retorna uma frase. I tendem a fazer tais métodos métodos vazios.
Além disso, ter o cuidado de fazer com que cada propriedade em seu modelo de domínio tem getters públicas e setters. Isso pode levá-lo a um modelo de domínio anêmico.
Outras dicas
Apenas alguns pensamentos:
setId (int phraseId) não devem ser públicos
Frase poderia implementar iPhrase (ou IPhraseAggregate) que não iria expor setId (..)
SavePhrase (frase Frase) poderia (deveria?) Volta vazia se a referência à frase estadias entidade "válido" depois de salvar:
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
}