【问题标题】:DDD paradigm. Is it possible to use a service from the Infrastructure layer on the Application Core.Domain layerDDD 范式。是否可以在 Application Core.Domain 层上使用基础设施层的服务
【发布时间】:2020-12-23 09:22:14
【问题描述】:

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

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

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

  3. Infrastructure - 包含指向ApplicationCore.DomainApplicationCore.App 的链接。 实现ApplicationCore.App层的端口

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

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

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

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

如何最好地实现它。

【问题讨论】:

    标签: c# domain-driven-design


    【解决方案1】:

    我不得不承认,要理解所有内容有点困难。尤其是在最后,您谈到的对象不清楚它们在哪里以及它们在做什么。

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

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

    【讨论】:

    • 我认为这个问题更准确,在域级别需要该服务,该服务具有依赖关系,要创建它需要从数据库中提取设置。如果依赖项设置不是动态的,而是在应用程序启动时已知的,如数据库设置或 Exchange Queues,则使用已知设置在 DY 中注册此类服务,然后由应用程序简单地使用它——级服务。我需要一个具有依赖关系的域级服务,我需要来自域的实体来创建它。
    猜你喜欢
    • 2017-06-10
    • 2010-11-25
    • 2021-11-22
    • 1970-01-01
    • 2020-10-12
    • 2012-01-30
    • 2021-01-08
    • 1970-01-01
    • 2018-03-26
    相关资源
    最近更新 更多