为了在存储库之间共享 DbContext 而创建 UofW 是否正确?

Is it correct to create UofW in order to share the DbContext among the Repositories?

创建工作单元以便在存储库之间共享 DbContext 是否正确?

如果不是,建议是什么?我真的认为有时需要共享 DbContext。

我问这个问题是因为这个问题的答案:

您需要的是 class 包含多个存储库并创建 UoW。然后,当您有一个用例需要将多个存储库与共享 UoW 一起使用时,此 class 会创建它并将其传递给存储库。

我通常将此称为 class 服务,但我认为没有一些标准化的命名。

Is it correct to create Unit of Work in order to share the DbContext among the Repositories?

这是设计决定,但是是的。这样做没有问题。来自多个存储库的代码在一个连接下执行是绝对有效的。

I really think it is needed to share the DbContext sometimes.

当然;很多时候你需要分享 DbContext.

您的链接答案非常好。我特别喜欢它提到的三点。 OP 在这个问题上正在做一些不必要的复杂事情,比如单例、服务定位器和异步调用,而不了解它们是如何工作的。所有这些都是好东西,但前提是在正确的时间正确的地方使用它们。

以下内容来自您的链接答案:

The best thing is that all of these could be avoided if people stopped attempting to create a Unit of Work + Repository pattern over yet another Unit of Work and Repository. Entity Framework Core already implements these:

是;这是真实的。但即便如此,存储库和 UoW 在某些情况下可能会有帮助。这是基于业务需求的设计决策。我在下面的回答中对此进行了解释:


在调用代码中直接使用ORM存在以下问题:

  1. 它使代码稍微复杂一些。
  2. 数据库代码合并到业务逻辑中。
  3. 由于在调用代码中内联使用了许多 ORM 对象,因此很难对代码进行单元测试。

所有这些问题都可以通过在数据访问层中创建具体存储库来解决。 DAL 应该通过接口向调用代码(BLL 或服务或控制器)公开具体的存储库。这样,您的数据库和 ORM 代码将在 DAL 中完全使用,您可以通过模拟存储库轻松地对调用代码进行单元测试。请参阅 this 文章,该文章解释了存储库的好处,即使使用 ORM。

除上述所有内容外,另一个普遍讨论的问题是"What if we decide to change ORM in future"。这在我个人的理解上是完全错误的。它很少发生,在大多数情况下,设计时不应考虑。

我建议避免过度思考和过度设计。专注于您的业务目标。

参考 this 示例代码以了解如何在存储库中注入 UoW。代码示例与 Dapper 一起使用。但整体设计可能对你还是有用的。