이 엔티티 리포지토리 서비스 예제는 도메인 중심 디자인에 적합합니까?
-
19-08-2019 - |
문제
도메인 구동 디자인에서 다음 패턴을 의미하는지 알고 싶습니다.
도메인 층은 모델과 저장소로 구성됩니다. 애플리케이션 계층은 사용자 인터페이스 또는 Model-View-Controller 패턴의 컨트롤러에서 쿼리를 처리하는 서비스로 구성됩니다.
구조의 세부 사항 :
// Assembly Model: public class Phrase { public int PhraseId { get; 사적인 set; } public string PhraseText { get; 사적인 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(문구 문구); 구절 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(새로운 문구 (phrasetext)); // doing other things like sending mail, logging, etc. // ... return Phrase; } }
특히, 메소드를 문구 엔티티 클래스로 옮기는 것이 합리적입니까? 이 경우 어떻게 호출 될까요?
편집하다:
위의 예는 Moffdub의 답변과 Adeel Ansari의 의견 후에 수정되었습니다. 변경 사항이 있습니다 강조 표시.
추가 된 iphraserepository.getphrase (phraseId)에 대해 물어보고 싶습니다.
해결책
저장소는 문자열이 아닌 문구를 가져와야합니다. 또한 SavePhrase 메소드가 왜 문구를 반환하는지 잘 모르겠습니다. 나는 그러한 방법을 무효화하는 경향이 있습니다.
또한 도메인 모델의 모든 속성을 공개적으로 만드는 데주의를 기울여야합니다. 이로 인해 빈혈 영역 모델로 이어질 수 있습니다.
다른 팁
몇 가지 생각 :
setid (int phraseid)는 공개되어서는 안됩니다
문구는 setid를 노출시키지 않는 iphrase (또는 iphraseAggregate)를 구현할 수 있습니다 (..)
저장 후 문구 엔티티에 대한 참조가 "유효한"상태를 유지하면 SavePhrase (Phrase phrase)를 반환 할 수 있습니다.
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
}
제휴하지 않습니다 StackOverflow