【问题标题】:Converting from N-Layer to DDD从 N 层转换为 DDD
【发布时间】:2018-04-27 12:58:13
【问题描述】:

我正在努力理解如何通过让我的域实体有自己的行为来将我的网站重构为更简洁的代码。

我希望我已经设法在这张图中描述了我的问题:

A 是我目前的 Web 应用项目设计,而 B 是我的目标设计。

我正在尝试将我当前 BL 中的所有逻辑插入到我的实体中,以便如下代码行:

var customer = new CustomerLogic().GetCustomer(id);

会变成:

var customer = new Customer(id);

或者,

var customer = Customer.Get(id);

当我看到多态情况时,这一点就更加明显了。

问题在于,在我当前的设计 (A) 中,实体只是被使用,所以所有项目都引用它,未来的设计 (B)实体必须具有对较低层的引用。

但由于我还希望我的 DAL 将我的实体交付回调用客户端,所以我得到了一个循环引用。

我当前的设计使我的代码比面向对象更程序化,我想改变它。

那么,如何在维护 DDD 的同时解决这个循环引用?

【问题讨论】:

    标签: architecture domain-driven-design n-layer


    【解决方案1】:

    您通过 inverting 来自实体的依赖(在 DDD 中是聚合,其中每个聚合包含一个聚合根和零个或多个嵌套实体)来解决循环依赖。换句话说,Domain 层不应该对其他层有任何依赖,例如 Persistence、Application 或 Presentation。

    一个完整的用例应该是这样的:

    customerId = request.get('customer_id')
    customer  = repository.load(customerId)
    customer.doSomethingImportant() //business logic that doesn't need anything from other layers
    repository.save(customer)
    

    如果不知何故,您的聚合需要一些来自外部的信息来完成它的工作,那么您将该信息作为参数传递,如下所示:customer.doSomethingImportant(some, info, fromOutside)

    您应该在这里注意的重要方面是聚合的方法不会改变除了它自己的状态之外的任何其他东西。例如,它不发送电子邮件,不写入文件,甚至不写入数据库。然后,该突变状态由存储库获取并保存在数据库中。通过这种方式,您可以反转对 DAL/数据库的依赖关系。

    在事件溯源中,这种变异状态采用领域事件的形式。在平面/经典架构中,存储库(通常是 ORM)计算差异并对数据库执行更改。

    【讨论】:

    • 你能澄清一下你的用例应该在哪个层吗?我猜你的用例需要有一些层引用存储库层和实体。所以它看起来像一个业务逻辑层。我对么?你会把那个层叫做别的吗?谢谢!
    • @YanivHer 我的用例遍历 Presentation(它知道 request)和应用程序。业务层将包含doSomethingImportant 方法的主体(您看不到这里)。
    • 从我对 DDD 书的阅读来看,Domain 层依赖于 Infrastructure 层(上面有 UI 和 Application 层,它们也依赖于 Infrastructure 层)。此外,每个存储库都属于域层。依赖倒置是任何架构都可以做的事情,但在 DDD 分层架构中则不需要。
    • @Rogério 那本书很棒,但不是因为分层架构;该架构只是一个示例(我认为这是一个糟糕的示例),一个实现细节,人们不应该认为分层架构 === DDD。另一方面:我从未使用过它。
    • 在 DDD 中,域模型中的软件组件(例如,域服务或存储库)确实依赖(即,具有编译时依赖)来自“基础架构”(这是应用程序代码库的另一部分,无论您是否称其为“层”)。这在实际项目中非常常见(例如,域服务类可能使用电子邮件发送类、数据库访问类或日期实用程序类,所有这些都是基础架构组件)。
    猜你喜欢
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    • 2014-02-19
    • 2013-11-04
    • 2021-12-08
    相关资源
    最近更新 更多