gpt4 book ai didi

c# - 到存储库或不到存储库

转载 作者:行者123 更新时间:2023-11-30 16:12:10 25 4
gpt4 key购买 nike

当我第一次了解领域驱动设计时,我还了解到了存储库和工作单元模式,这些模式曾经似乎是酷 children 的最佳选择,他们像穴居人一样对数据库进行 SQL 查询。我越深入这个话题,就越了解到它们似乎不再是必需的,因为 ORMEFNHibernate将工作单元和存储库实现到一个 API 中,称为 session 或上下文。

现在我不确定该怎么做。到存储库或不到存储库。我真的理解这样的论点,即这种有漏洞的抽象只会使事情过于复杂,而绝对不会添加任何可以简化数据访问的东西,但是,将我的应用程序的每个可能方面都耦合到例如 Entity Framework 。通常,我会遵循一些简单的准则:

  1. 领域层是系统的核心,包含实体、服务、存储库……
  2. 基础设施层提供基础设施问题领域接口(interface)的实现,例如文件、数据库、协议(protocol)..
  3. 应用层托管一个组合根,用于连接和编排一切。

我的解决方案通常是这样的:

Domain.Module1
Domain.Module2
IModule2Repo
IModule2Service
Module2
Infrastructure.Persistence
Repositories
EntityFrameworkRepositoryBase
MyApp
Boostrapper
-> inject EntityFrameworkRepositoryBase into IRepository etc.

我使用 IRepository<'T> 来保持我的域层干净这也是一个领域问题,不依赖于告诉我如何访问数据的任何其他内容。当我现在具体实现 IModule2Service 时需要数据访问,我将不得不注入(inject) DbContext通过这种方式,将其直接耦合到基础设施层。(对于 Visual Studio 项目,由于循环依赖性,这最终会非常棘手!)

另外有什么可以替代depositoriesfucktons of works? CQRS?如何抽象出一个纯粹的基础架构?

最佳答案

“存放处”哈哈....

无论如何,您不希望将域耦合到 EF 这一点是正确的,这就是为什么存储库界面中的 T 应该是 domain aggregate root 和 < strong>不是EF 实体(或旨在与 EF 正常工作的“域”对象)。

您的域层永远不会与持久性耦合,因为它只知道抽象。当 Module2Service 需要数据访问时,它要么使用 DAO(或存储库 - 不一定是 DDD 版本 - 如果有意义的话),要么服务本身是在 DAL 中实现的(如果它不包含业务逻辑)。

在您的情况下,最好的方法可能是 DAO/存储库,它当然会“隐藏”EF 部分。如果看起来您编写了太多代码,但实际上并没有,我认为保持适当的关注点分离比节省 50 LoC(整整 5-10 分钟)更重要。

对于丰富的领域,CQRS 始终是个好主意,但作为任何解决方案,它都有一个缺点,即它需要更多代码(而且我知道每个编码人员都是懒惰的,但我们需要做一些“操蛋”的工作,一个应用程序不会自行构建,一个可维护的应用程序在开始时甚至需要更多工作)。如果通过抽象一个纯基础结构框架,你的意思是隐藏 EF,存储库是你最好的选择,你甚至不必将类命名为“存储库”,这是重要的原则,这就是存储库所做的:抽象域的持久性.

关于c# - 到存储库或不到存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23362862/

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