1.引言

在针对大型的复杂领域进行建模时,聚合、实体和值对象之间的依赖关系可能会变得十分复杂。在某个对象中为了确保其依赖对象的有效实例被创建,需要深入了解对象实例化逻辑,我们可能需要加载其他相关对象,且可能为了保持其他对象的领域不变性增加了额外的业务逻辑,这样即打破了领域的单一责任原则(SRP),又增加了领域的复杂性。

那如何去创建复杂的领域对象呢?因为复杂的领域对象的生命周期可能需要协调才能进行创建。 这个时候,我们就可以引入创建类模式——工厂模式来帮忙,将对象的使用与创建分开,将对象的创建逻辑明确地封装到工厂对象中去。

2. DDD中的工厂

我们有必要先理清工厂和工厂模式。
DDD中工厂的主要目标是隐藏对象的复杂创建逻辑;次要目标就是要清楚的表达对象实例化的意图。
而工厂模式是计模式中的创建类模式之一。借助工厂模式我们可以很好实现DDD中领域对象的创建。

而针对工厂模式的实现主要有四种方式:

  • 简单工厂:简单实用,但违反开放封闭;

  • 工厂方法:开放封闭,单一产品;

  • 抽象工厂:开放封闭,多个产品;

  • 反射工厂:可以最大限度的解耦。

具体实现可以参考创建相似对象,就交给『工厂模式』吧

3.封装内部结构

当需要为聚合添加元素时,我们不能暴露聚合的结构。我们以添加商品到购物车为例,来讲解如何一步一步的使用工厂模式。

一般来说,添加到购物车需要几个步骤:

  1. 加载用户购物车

  2. 获取商品税率

  3. 创建新的购物车子项

相关的应用层代码如下:

namespace Application {    public class AddProductToBasket {        // ......
        public void Add (Product product, Guid basketId) {            var basket = _basketRepository.FindBy (basketId);    &n
        
		

网友评论