【发布时间】:2021-08-09 09:10:15
【问题描述】:
我看过很多项目是否将整个DbContext注入到一个类中:
public class MyClass
{
public MyClass(MyDbContext context)
{
...
}
public void DoStuff()
{
dbContext.MyTable.Select(x => x...)
}
}
为什么不这样做:
public class MyClass
{
public MyClass(DbSet<MyType> myTypes)
{
...
}
public void DoStuff()
{
myTypes.Select(x => x...)
}
}
我发现 #2 更清楚地说明了对象需要操作哪些数据。它使单元测试更加清晰,因为从构造函数中可以明显看出依赖关系。否则,您必须检查该方法的实现以找出它确切需要哪些数据,以便正确设置测试。
那么为什么 #1 是常态?
(P.S. 抱歉标签不好,但似乎标签系统已损坏)
【问题讨论】:
-
因为你需要
DbContext来做任何有用的事情,比如保存对数据库的更改。此外,因为将 20DbSet<T>注入 DI 比仅注入DbContext更痛苦。可能还有很多其他的事情 -
@CamiloTerevinto 为什么 SaveChanges 不能作为扩展方法来弥补它不在 DbSet 上?对于注册,可以只注册所有可在上下文中分配给 DbSet 的公共属性。所以不需要手动添加Di中的所有DbSet。
-
好吧,使用扩展方法只会隐藏对 DbContext 的依赖,让测试变得更加困难
-
见DbContext lifetime。注意重要部分。
-
我不同意这里的大多数观点,并且更喜欢看到注入单个存储库(EF 术语中的 DbSet)而不是整个数据库上下文。例如。 1. 业务层不知道事务何时完成——它只知道它的工作何时完成。 2. 谁编写了一个更新 20 个存储库的类?
标签: c# entity-framework dependency-injection anti-patterns