为了在存储库之间共享 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存在以下问题:
- 它使代码稍微复杂一些。
- 数据库代码合并到业务逻辑中。
- 由于在调用代码中内联使用了许多 ORM 对象,因此很难对代码进行单元测试。
所有这些问题都可以通过在数据访问层中创建具体存储库来解决。 DAL 应该通过接口向调用代码(BLL 或服务或控制器)公开具体的存储库。这样,您的数据库和 ORM 代码将在 DAL 中完全使用,您可以通过模拟存储库轻松地对调用代码进行单元测试。请参阅 this 文章,该文章解释了存储库的好处,即使使用 ORM。
除上述所有内容外,另一个普遍讨论的问题是"What if we decide to change ORM in future"。这在我个人的理解上是完全错误的。它很少发生,在大多数情况下,设计时不应考虑。
我建议避免过度思考和过度设计。专注于您的业务目标。
参考 this 示例代码以了解如何在存储库中注入 UoW。代码示例与 Dapper 一起使用。但整体设计可能对你还是有用的。
创建工作单元以便在存储库之间共享 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存在以下问题:
- 它使代码稍微复杂一些。
- 数据库代码合并到业务逻辑中。
- 由于在调用代码中内联使用了许多 ORM 对象,因此很难对代码进行单元测试。
所有这些问题都可以通过在数据访问层中创建具体存储库来解决。 DAL 应该通过接口向调用代码(BLL 或服务或控制器)公开具体的存储库。这样,您的数据库和 ORM 代码将在 DAL 中完全使用,您可以通过模拟存储库轻松地对调用代码进行单元测试。请参阅 this 文章,该文章解释了存储库的好处,即使使用 ORM。
除上述所有内容外,另一个普遍讨论的问题是"What if we decide to change ORM in future"。这在我个人的理解上是完全错误的。它很少发生,在大多数情况下,设计时不应考虑。
我建议避免过度思考和过度设计。专注于您的业务目标。
参考 this 示例代码以了解如何在存储库中注入 UoW。代码示例与 Dapper 一起使用。但整体设计可能对你还是有用的。