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

时间:2009-01-17 00:13:30

标签: 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 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)以及如何包含它?

2 个答案:

答案 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
}