【问题标题】:Entity Framework Core 3: Interface on DBContext good practice?Entity Framework Core 3:DBContext 上的接口好的做法?
【发布时间】:2021-05-06 22:52:41
【问题描述】:

在 Entity Framework Core 3.1 中在 DBContext 上创建接口是一种好的做法吗? Microsoft 有这方面的任何文档吗?

我们知道在单元测试中模拟 DBContext 是不好的做法,但是如何在它之上创建一个接口呢?

https://docs.microsoft.com/en-us/ef/core/testing/

“但是,我们从不尝试模拟 DbContext 或 IQueryable。这样做是 困难、麻烦和脆弱。不要这样做。”

资源: Why DbContext doesn't implement IDbContext interface?

【问题讨论】:

  • 您的用例是什么?您是在谈论连接 DbContext 本身还是实体?
  • 我建议不要从 DbContext 中提取接口,而是使用存储库模式并从存储库/存储库和 UnitOfWork 中提取接口
  • 嗨 @Xerillio 与 DbContext 本身交互

标签: c# .net entity-framework .net-core ef-core-3.0


【解决方案1】:

如果您的目标是促进与 DbContext 交互的单元测试代码,那么我建议您将存储库模式与工作单元一起实现以管理 DbContext 生命周期范围和提交。我已经在各种答案中概述了实现灵活且易于测试的存储库类的有效方法,但这个可能总结得最好:(How to set multiple services from Entity Framework Core on Repository Pattern?)

我建议避免使用通用存储库实现并利用 EF 的IQueryable 支持的强大功能来构建一个极其简单的模拟层,以提供高效和灵活的查询。

最后一个细节是,如果您确实希望支持 async 通过存储库进行查询并希望对它们进行单元测试,可以在此处找到支持此功能的宝贵提示:(Unit-testing .ToListAsync() using an in-memory)

【讨论】:

  • 这很有帮助,原始问题如何,是否在数据库上应用接口?
  • 出于什么目的?您说“我们知道在单元测试中模拟 DBContext 是不好的做法,但是在它上面创建一个接口怎么样?”因此,如果您想围绕它进行单元测试,请使用存储库模式。将接口放在它上面并不能完成任何事情,因为您仍然处于必须模拟复杂结构的位置,例如DbSet,或者暴露IQueryable,或者更糟糕的是,IEnumerable 代替 every 数据库集。 (存储库只公开被测消费者预期需要的东西)
  • 好吧,我试图理解为什么我的架构师试图在 dbContext 上创建接口,我已经告诉他,微软文章不推荐模拟 dbContext,那么还有什么其他原因呢?开会前需要准备笔记
  • 我的猜测是“为了抽象而抽象”。 :) 一个好的回应是:stackoverflow.com/questions/50174203/… 总会有开发人员想要尝试“隐藏”他们正在使用实体框架 DbContext 的事实,或者努力尝试模拟它。这通常会以极其复杂的混乱和/或性能噩梦告终。
  • 也许你也可以回答这个问题?谢谢stackoverflow.com/questions/66022434/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-22
  • 1970-01-01
  • 2017-06-13
  • 2022-11-21
  • 1970-01-01
  • 2016-05-21
  • 1970-01-01
相关资源
最近更新 更多