Service 此实体存储库服务示例是否适合域驱动的设计?

Service 此实体存储库服务示例是否适合域驱动的设计?,service,model,domain-driven-design,entity,repository-pattern,Service,Model,Domain Driven Design,Entity,Repository Pattern,我想知道您是否发现以下模式在域驱动设计中有意义 域层由模型和存储库组成。应用程序层由处理来自用户界面或模型-视图-控制器模式中的控制器的查询的服务组成 结构详情: // Assembly Model: public class Phrase { public int PhraseId { get; private set; } public string PhraseText { get; private set; } public Phrase(string phra

我想知道您是否发现以下模式在域驱动设计中有意义

域层由模型和存储库组成。应用程序层由处理来自用户界面或模型-视图-控制器模式中的控制器的查询的服务组成

结构详情:

// 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; } } //装配模型: 公共类短语 { public int PhraseId{get;private set;} 公共字符串短语文本{get;private set;} 公共短语(字符串短语文本){this.phraseText=phraseText;} public void SetId(int phraseId){this.phraseId=phraseId;} } //程序集存储库(引用程序集模型): 公共接口IPhraseRepository { 短语保存短语(短语短语); 短语GetPhrase(int phraseId); } //程序集服务(参考程序集模型和存储库): 公共课堂用语服务 { 私人IPhraseRepository词汇库; 公共短语服务(IPhraseRepository短语存储库) { _短语存储库=短语存储库; } 公共短语保存短语(字符串短语文本) { 短语短语=_phraseRepository.SavePhrase(新短语(短语文本)); //做其他事情,如发送邮件、记录日志等。 // ... 返回短语; } } 特别是,将方法移动到短语实体类中是否有意义?如果是这样,那该怎么称呼呢

编辑:

在moffdub的回答和Adeel Ansari的评论之后,对上述示例进行了修改。这些更改将突出显示


我想问一下添加的IPhraseRepository.getphraseId,以及您将如何包含它?

存储库应该包含一个短语,而不是一个字符串。我也不知道为什么SavePhrase方法会返回一个短语。我倾向于使这种方法无效

另外,要小心使域模型中的每个属性都具有公共getter和setter。这可能会导致你的领域模型贫血。

只是一些想法:

SetId(int-phraseId)不应该是公共的

短语可以实现不会公开SetId(..)的IPhrase(或iphraseaggreegate)

如果对短语实体的引用在保存后保持“有效”,则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
}

在持久化实体之前,请认为您没有id。在这种情况下,您必须返回实体。想想数据库中的自动编号类型或序列。@moffdub和@Adeel Ansari:谢谢你的回复。我想,我学到了一些东西,并将以建议的改进进行更新。如何使用私有setter进行序列化?请看我的问题:。关于GetPhase:我认为它看起来不错。另一个选项是使用查询对象()作为参数,如果您需要的条件不止是id。关于SavePhrase的一条注释:在这种情况下,如果您在保存之前无法获取短语id,我通常使用“save”方法,或者不返回任何内容并在方法中设置id,或者返回新id。