DDD中对象验证和持久性验证之间的区别?

Mic*_*thy 3 validation domain-driven-design

现在,我有一个名为StyleBundle的域名实体.这个StyleBundle有一个样式列表:

public class StyleBundle
{
    public StyleBundle(List<Style> styles)
    {
        this.Styles = styles;
    }

    public IEnumerable<Style> Styles { get; private set;}
}
Run Code Online (Sandbox Code Playgroud)

因此,在我的原始设计中,永远不应该使用空样式列表创建StyleBundle.领域专家基本上说这是一个很好的规则.

我在构造函数中使用guard子句写了这个:

if (styles.Count() == 0)
   throw new Exception("You must have at least one Style in a StyleBundle.");
Run Code Online (Sandbox Code Playgroud)

这确保我无法在无效状态下创建StyleBundle.我认为这里的异常是有道理的b/ca StyleBundle在没有至少一个Style的情况下被创建在系统中是特殊的.

当然,在项目的其余部分进行改变时,现在应该可以让用户创建没有样式的StyleBundle,但是不应该允许他们在没有样式的情况下使用StyleBundle.

所以现在我正在查看我的guard子句,并意识到我不能再从构造函数中抛出异常了.

接下来,我有一个服务/应用程序层,我的代码隐藏在他们使用StyleBundles时与之交互.在我的服务层中,我有一个StyleBundleService类,该类向UI公开基本功能......其中包括"CreateStyleBundle".

似乎我必须检查我的服务层以查看StyleBundle在持久存储到数据库之前是否有任何样式,但是这个决定对我来说感觉"错误".

有人碰到类似的事吗?基本上,当"新建"时对象的状态与持久性时相同对象的状态之间的差异?

谢谢!麦克风

Wou*_*ort 6

我会IsValid为你的实体添加一个方法.这将检查实体当前是否处于有效状态(在您的情况下,检查是否存在样式).

可以从您的方法调用此方法Repository来检查实体是否可以持久化.您可以IsValid为特定实体的方法添加更多规则,并且您可以实现诸如验证错误集合之类的内容,您希望抛出有意义的异常.