gpt4 book ai didi

asp.net-mvc - 洋葱架构 - 存储库与服务?

转载 作者:行者123 更新时间:2023-12-03 08:53:01 30 4
gpt4 key购买 nike

我正在向 Jeffrey Palermo 学习著名的洋葱架构。
不特定于这种模式,但我无法清楚地看到存储库和域服务之间的分离。
我(错误地)理解存储库涉及数据访问和服务更多的是关于业务层(引用一个或多个存储库)。

在许多示例中,存储库似乎背后有某种业务逻辑,例如 GetAllProductsByCategoryId。或 GetAllXXXBySomeCriteriaYYY .

对于列表,服务似乎只是存储库上的一个包装器,没有任何逻辑。
对于层次结构(父/子/子),几乎是相同的问题:存储库的角色是加载完整的层次结构吗?

最佳答案

查看 Services in Domain-Driven Design (DDD) 上的服务和存储库之间的关系由 Lev Gorodinski来自 Vaughn Vernon 的更新强调 Hexagonal Architecture风格:

An application service has an important and distinguishing role - itprovides a hosting environment for the execution of domain logic. Assuch, it is a convenient point to inject various gateways such as arepository or wrappers for external services.


服务是应用程序核心的一部分,正如 Onion Architecture 所描绘的那样。或 Chris Richardson 的微服务模式第 148 页在 Hexagonal Architecture 的上下文中.
另一方面,存储库实现只是一个适配器,它能够将应用程序的消息转换为存储系统(可以是任何东西:数据库、文件等)。另见 The Clean Architecture 中的接口(interface)适配器部分(谈论接口(interface)适配器层):

If the database is a SQL database, then all the SQL should berestricted to this layer ...


Hexagonal Architecture 上搜索“存储库适配器”第 3 部分:(FIT 或 UI)应用程序模拟数据库将存储库实现视为适配器。
另一方面,存储库接口(interface)是应用程序核心的一部分:
  • 查看Onion Architecture :

  • The first layer around the Domain Model is typically where we wouldfind interfaces that provide object saving and retrieving behavior,called repository interfaces.


  • 另请参阅 Chris Richardson 的 Microservices Patterns 第 159 页,在 Hexagonal Architecture 的上下文中

  • 根据 Eric Evans 领域驱动设计:

    When a significant process or transformation in the domain is not anatural responsibility of an ENTITY or VALUE OBJECT, add an operationto the model as standalone interface declared as a SERVICE. Define theinterface in terms of the language of the model and make sure theoperation name is part of the UBIQUITOUS LANGUAGE. Make the SERVICEstateless.


    因此,服务只是包含业务逻辑的东西。
    我的结论:服务是业务逻辑的构建 block ;存储库只是为存储系统的业务逻辑提供访问权限的适配器。可以模拟适配器以单独测试业务逻辑,或者可以创建额外的存储库适配器为应用程序提供更多存储选项(例如文件适配器、无 sql 数据库适配器等)。
    关于 GetAllProductsByCategoryIdGetAllXXXBySomeCriteriaYYY存储库方法应该表明它们的意图,这样它们的命名就可以非常有表现力;虽然这些方法只包含与存储系统通信的逻辑,但它们很好。基于方法命名可能非常有意义的事实,一些框架(例如 Spring Data)能够为这些方法创建/生成实现,并且没有任何错误/奇怪的地方。另一方面,人们可能希望以各种方式优化/减少存储库方法的数量,例如让它们接受复杂的标准对象或标准列表,而不是为这些标准的每个组合提供一个方法,但这不会改变存储库(实现)的角色,它仍然是一个适配器。
    关于“加载完整层次结构是存储库的角色吗?”
    至此,存储库(实现)的作用应该很清楚了:传递应用程序的消息/请求,用于存储系统。消息/请求可以是例如“给我由 123 标识的人”或“给我一个符合某些标准的人的列表”或“给我一个符合某些标准的完整层次结构”,只要消息/请求可以这样翻译到存储系统.例如,某些存储系统无法提供/返回层次结构对象,因此应该创建一个服务来构造层次结构对象;其他存储系统能够提供/返回层次结构对象,但其类型特定于其 API/驱动程序,因此存储库(实现)应将其转换为 DTO,该 DTO 可能由服务进一步处理以构造业务层次结构对象.请记住:存储库(实现)只是一个应该可以模拟(用于测试目的)的适配器。
    边注
    另请注意,可能有更多类型的服务:应用程序服务和域服务 - 参见 Onion Architecture 中的描述。但在 Services in Domain-Driven Design (DDD) 上有更好的解释由 Lev Gorodinski应该在哪里检查:

    The differences between a domain service and an application servicesare subtle but critical

    关于asp.net-mvc - 洋葱架构 - 存储库与服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12317126/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com