我想知道您是否在域驱动设计中发现以下模式有意义。
域层由模型和存储库组成。应用程序层由处理来自用户界面或模型 - 视图 - 控制器模式中的控制器的查询的服务组成。
结构细节:
// 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; } }
特别是,将方法移入Phrase实体类是否有意义?在那种情况下,会怎么称呼?
编辑:
上面的例子在moffdub的回答和Adeel Ansari的评论之后进行了修改。更改突出显示。
我想问一下添加的IPhraseRepository.GetPhrase(phraseId)以及如何包含它?
答案 0 :(得分:1)
存储库应该包含一个短语,而不是一个字符串。我也不确定为什么SavePhrase方法会返回一个短语。我倾向于使这些方法无效。
另外,要小心你的域模型中的每个属性都有公共getter和setter。这可能会导致你陷入贫血领域模式。
答案 1 :(得分:0)
只是一些想法:
SetId(int phraseId)不应该是公开的
短语可以实现IPhrase(或IPhraseAggregate),它不会暴露SetId(..)
如果保存后对短语实体的引用保持“有效”,SavePhrase(短语短语)可以(应该?)返回void:
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
}