我是域驱动设计的新手,但试图将它应用到我当前的 c#.net 项目中。要求之一是允许用户为实体定义业务规则(即需要客户端名称) 不同的用户组将定义他们自己的规则集,因此我将它们存储在数据库中。
我已经阅读了几篇解释规范模式的文章,但是有什么方法可以使用它来应用存储在数据库中的规则?在以前的非 DDD 项目中,我在实体上有一个 IList 属性并调用 GetBrokenRules(Client client) 方法来加载规则并检查客户端是否有效。做同样的事情而不使用规范模式会更好吗?
我是域驱动设计的新手,但试图将它应用到我当前的 c#.net 项目中。要求之一是允许用户为实体定义业务规则(即需要客户端名称) 不同的用户组将定义他们自己的规则集,因此我将它们存储在数据库中。
我已经阅读了几篇解释规范模式的文章,但是有什么方法可以使用它来应用存储在数据库中的规则?在以前的非 DDD 项目中,我在实体上有一个 IList 属性并调用 GetBrokenRules(Client client) 方法来加载规则并检查客户端是否有效。做同样的事情而不使用规范模式会更好吗?
规范模式是关于尝试通过一组搜索条件在存储库中查找实体。您无需定义一长串(可能)可选参数,而是构建规范,然后将其转换为您在后台使用的任何查询语言。
您的业务规则是关于实体验证的,所以我想说规范模式在这里不太适合。虽然也不是不可能。
您建议的加载规则和调用 GetBrokenRules 方法的方法似乎是一个明智的选择。
动态验证规则尖叫工厂模式。我可能会走让工厂生成验证规则的路线。正如所指出的,规范旨在建立一个谓词。
根据实现,可以动态组合规范以形成谓词来检查属性/模型/上下文是否有效,尽管这将代表单个规则。
如果您还没有,请查看 FluentValidation,它非常灵活,可能会提供您没有考虑过的方法。
我认为规范模式是解决这个问题的好方法。如果你还没有读过 这本书,请看看这本书。
您应该考虑创建一个复合规范,该规范将从域服务中的数据库构建。