DDD范式。是否可以在 Application Core.Domain 层上使用 Infrastructure 层的服务

DDD paradigm. Is it possible to use a service from the Infrastructure layer on the Application Core.Domain layer

对不起我的英语,我正在编写一个房地产评估模块,并决定尝试在 DDD 范式中编写。 我查看了示例和不同的文章,并为自己形成了下图(简化):

  1. ApplicationCore.Domain - 业务逻辑的核心,包含所有必要的对象,分为 2 种类型
    Entitys - 如果一个实体需要存储在数据库中,并且它是一个现成的完整业务逻辑对象。 ValueObjects - 封装行为的所有其他属性,通过字段的值进行比较,并且是实体的一部分 仅创建有效对象非常重要,因此我通过带有验证器的工厂创建所有内容,并且构造函数是私有的。 不应该有对其他依赖项的引用,尽可能隔离。

  2. ApplicationCore.App - ApplicationCore.Domain 之上的一层包含一个 link。 使用来自 ApplicationCore.Domain 的对象并通过 Port/Adapter 使用外部服务。 Port - 例如,存储库的抽象,它通过 Infrastructure 层上的 Adapter 实现。
    ApplicationCore 的交互逻辑在 AppServices 中——对于经典实现或在命令/请求中——对于 CQRS

  3. Infrastructure - 包含 link 到 ApplicationCore.DomainApplicationCore.App。 实现 ApplicationCore.App

    的端口

实体之间相互独立,通过key相互引用进行交互。 我在这个范式中保留了评估系统的基本逻辑。 但是这里有必要添加一项服务,该服务在窃听模式下从不同来源接收附加信息以进行评估。 那些。后台监听TcpIp socket

服务设置存储在数据库中并经常更改 - 即您需要引入新的 Entity 链条形成

DataProvider (ApplicationCore.Domain) -> IDataProviderRepository (ApplicationCore.App) -> EfDataProviderRepository (Infrastructure).

DataProvider - 必须依赖于 ITcpIpTransport,没有它它只是 TcpIpTransport 的一组设置。 从逻辑上讲,DataProvider 是一个接收数据的服务,但它有设置和状态存储在数据库中,即你需要使它成为 Entity。 如果你让 DataProvider 依赖于 Infrastructure 层,那么 ApplicationCore.Domain 也将有外部服务的端口,这是允许的吗?

如何最好地实施它。

我不得不承认这有点难以理解所有内容。特别是在最后,你说的对象不清楚它们在哪里和做什么。

无论如何,您不能将上层(基础结构)的任何东西用于下层(应用程序和域)。我不知道你会怎么做,但作为一个简单的依赖项,它不会让你编译任何项目。您将以循环依赖结束。

鉴于您不会这样做,您可以在域层中构建一个服务(我使用静态函数来避免任何不需要的实现)。该服务使用在应用程序层中实现的接口。在应用程序层中,您还将使用(或重用)将在基础结构层中实现的接口。