validation - DDD中对象验证和持久化验证的区别?

标签 validation domain-driven-design

现在,我有一个名为 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。我认为这里的异常是有意义的,因为在系统中创建的 StyleBundle 至少没有一种样式是异常的。

当然,在项目的其余部分发生了变化,现在用户应该可以创建没有样式的 StyleBundle,但不应允许他们坚持没有样式的 StyleBundle。

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

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

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

有人遇到过类似的事情吗?基本上,"new"时对象的有效状态与持久性时同一对象的状态之间的区别?

谢谢! 迈克

最佳答案

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

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

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

相关文章:

javascript - 验证以限制用户表单上传大文件

python - 为什么域驱动设计似乎只在 C# 和 Java 等静态语言中流行?

domain-driven-design - 当键未发生时查找读取模型投影行?

PHP MySQL - 清理和验证建议

Java - 全名的正则表达式

c# - DDD设计理解

domain-driven-design - 领域驱动设计 - 跨多个有界上下文的原子事务

domain-driven-design - 使用 UnitOfWork 和 DDD 原则有什么意义?

c# - 契约前置条件引起的IEnumerable多重枚举

wpf - 摆脱文本框验证边框