繁体   English   中英

如何检查洋葱架构域层中的业务逻辑?

[英]How to check Business logic in Onion Architecture Domain Layer?

我一直在从事网站开发,最近开始使用MVC创建一个电子商务项目。

我决定使用洋葱架构进行开发。 据我了解,我的逻辑分为两个不同的领域:应用程序逻辑和业务逻辑。

如您所知,我在两个地方实现了这些逻辑: 业务逻辑的域层和应用程序逻辑的服务层 而且根据洋葱架构域层与基础层等上层也没有关系

因此,我必须在域层中检查这些业务逻辑,并根据情况抛出适当的异常。例如,“具有正的产品价格”是业务逻辑。 该逻辑不需要与数据库有关系。 但是,如果我要检查“ 产品的重复名称 ”怎么办? 我确定我不应该在服务层中检查此逻辑 我应该在哪里以及如何检查这些逻辑。

如果我必须具有验证层,那么如何建立该层的关系? 感谢您的回复。

我通常在域层中定义存储库接口,例如ICustomerIOrder ,...和自己的基础结构层中的具体对象CustomerRepositoryOrderRepository ,...。 如果域层中的方法在正常执行期间需要数据库中的某些内容,那么我将适当的存储库接口从服务层注入该方法中,而仅使用我需要的数据库方法。

有时,最好为功能定义自己的接口,例如,使用方法CheckForDuplicates(string name) ICanCheckForDuplicateNames (此接口在域层中)。 在服务层中,我将实例化一个实现ICanCheckForDuplicateNames的对象(此对象在基础结构层中定义),并将其作为参数传递给域对象。

而且,如果您不需要数据库方法的结果而只需要调用它,例如Log(string message) ,则可以在域模型中定义一个事件,并在执行过程中引发它,服务层将处理它。 这样,您无需将任何内容从服务层传递到域层类方法。

DDD中的核心概念之一是集合的概念-本质上是一个实体或一组实体,它们可以以事务一致的方式强制执行一组[不变式]。

可以将不变量定义为必须始终为真的业务规则,而不是在特殊时期(例如,在进行业务交易时)。

但是,更具体的定义是查看聚合的不变量-这些是始终单个聚合或操作中强制执行的业务规则。 这意味着不变量必须基于聚合中包含的数据或通过命令或方法参数传递到聚合中的数据来强制执行。

描述这种情况的一种方法是,在集合的一致性边界内强制执行不变式。 之所以称为一致性边界,是因为遵循DDD建议并且每次数据库提交仅修改一个聚合,就只能保证该边界内的数据一致性。

有关聚合和不变式的出色文章,请参见http://www.informit.com/articles/article.aspx?p=2020371&seqNum=1

在整个系统上强制执行唯一约束是一项常见的要求-但是,如果您考虑一下,那么单个聚合就不可能强制执行唯一的名称约束,因为它需要了解该聚合的所有其他实例检查-从而违反了一致性边界的原则。

有几种解决此类问题的方法:

  • 接受该规则不一定总是得到执行,而是总是要“最终”得到执行(一种称为最终一致性的概念)。

    • 您可以通过设置名称引发一个事件,该事件然后触发执行逻辑以检查重复项并标记或发出警报,以便UI可以将用户的注意力吸引到需要注意纠正重复名的项目上。
  • 采取务实的方法并找出最有效的地方来执行此类规则,而不是在总范围内

    • 例如,执行唯一约束的传统且非常成功的地方是数据库本身-大多数RDBMS都允许在字段上指定唯一约束。 由于将在检查聚合名称的数据库事务范围内检查唯一性约束,因此这确实为您提供了此业务规则的原子一致性。
    • 此选项仅适用于所有数据都在一个数据库中的情况-如果已分片,则可能需要采用第一个选项

老实说,第二个选择是我始终对“通用唯一”规则(如果确实需要它们)进行操作,并且数据集的大小使得我希望有一个数据库。 但是,第一步是质疑是否需要这些假设,并检查与汇总相关联的用户故事,以了解实际的用户需求以及他们可以忍受的最终一致性级别。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM