0

在学习领域驱动设计时,我一直在整理以下解决方案(请注意,此排序是字典顺序的,而不是依赖关系的表示):

在此处输入图像描述

以下是每个项目的概要:

Domain.Models: 域实体和值对象(例如Order

Domain.Interfaces: 域服务接口和存储库接口(例如IOrderServiceIOrderRepository

Domain.Services: 领域服务接口的具体实现(例如OrderService

Infrastructure.Data: 存储库接口的具体实现(例如OrderRepository

Infrastructure.DependencyResolution: 依赖注入解析。

问题

现在我想提供非域服务。一个示例是用于发送电子邮件的电子邮件网关。我为此创建了以下项目:

Infrastructure.Components: 非域服务的具体实现

问题

我会将此类非域服务的接口放在哪里(例如, an IEmailGateway)?

它需要可由Domain.Services项目访问(OrderService可能需要您发送通知),所以它会进入Domain.Interfaces吗?我会说不,因为发送电子邮件不是特定于域的活动。

4

2 回答 2

1

我会说不,因为发送电子邮件不是特定于域的活动。

当然可以,但是您可以通过使用更高的域抽象来摆脱困境。域不关心电子邮件,但通知将是一个完美的域概念。它实际上似乎已经成为通用语言的一部分,因为您在问题中使用了该术语。所以类似的东西INotifier而不是IEmailGateway

替代方法可能是:

  • 让总体应用程序服务通过 Infrastructure 中定义的 IEmailService 接口发送电子邮件。

  • 让 Order 实体或域服务引发一个域事件。基础设施层中的 EmailService 监听它并发送电子邮件。

于 2014-01-24T12:48:25.463 回答
1

如果发送电子邮件不是您的有界上下文的概念,那么这意味着它是另一个电子邮件的一部分。因此,您应该应用一些有界上下文集成模式,例如域事件的反腐败层。

无论您选择什么,我都会看到您的结构和解决方案存在另一个问题,这将消除问题中的问题。尝试根据使用通用语言而不是对象类型的有界上下文和模块来构建您的应用程序。因此,您应该拥有产品、客户、发货等,而不是接口、模型和服务。

于 2014-01-24T15:19:43.043 回答