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

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

    public IEnumerable<Style> Styles { get; private set;}
}

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

我在构造函数中使用保护子句写了这个:
if (styles.Count() == 0)
   throw new Exception("You must have at least one Style in a StyleBundle.");

这确保我无法在无效状态下创建 StyleBundle。我认为这里的异常(exception)是有意义的 b/c 在没有至少一个 Style 的情况下创建的 StyleBundle 在系统中是异常(exception)的。

当然,在项目的其余部分进行了更改,现在用户应该可以创建没有样式的 StyleBundle,但不应该允许他们保留没有样式的 StyleBundle。

所以现在我正在查看我的保护条款并意识到我不能再从构造函数中抛出异常了。

展望 future ,我有一个服务/应用程序层,我的代码隐藏在使用 StyleBundles 时与之交互。在我的服务层中,我有一个 StyleBundleService 类,该类向 UI 公开了基本功能……其中包括“CreateStyleBundle”。

似乎在将 StyleBundle 持久化到数据库之前,我必须让我的服务层检查它是否有任何样式,但我觉得这个决定有些“错误”。

有人遇到过类似的事情吗?基本上,当涉及到持久性时,对象的状态在“更新”时有效与同一对象的状态之间的不同?

谢谢!
麦克风

最佳答案

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

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

关于validation - DDD中对象验证和持久化验证的区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8804386/

10-10 13:08