C# DbContext,注入还是不注入?
这很可能是一个有一百万个答案的问题,但它让我很烦恼 我有一个使用EF的mvc应用程序。现在,我是将DbContext注入到业务对象中,还是以其他方式 很明显,我可以注入它,但这样我就可以在类中使用DbContext,而不是类型化上下文。这意味着我没有智能感知,代码看起来不那么优雅 乙二醇 现在我知道这不是一个大问题,但在编写成千上万行代码时,有intellisense在身边是很好的,特别是如果其他不太熟悉代码的程序员正在提供帮助的话 我知道存在工作单元模式,但在我看来,当涉及EF时,这是魔鬼自己的工作,因为它有效地将存储库模式包装在存储库模式中,这是非常可笑的。所以这不是我的选择 那么我们是否要注入,如果是这样,我们是否能以某种方式得到一个类型化的上下文C# DbContext,注入还是不注入?,c#,.net,asp.net-mvc,entity-framework-6,C#,.net,Asp.net Mvc,Entity Framework 6,这很可能是一个有一百万个答案的问题,但它让我很烦恼 我有一个使用EF的mvc应用程序。现在,我是将DbContext注入到业务对象中,还是以其他方式 很明显,我可以注入它,但这样我就可以在类中使用DbContext,而不是类型化上下文。这意味着我没有智能感知,代码看起来不那么优雅 乙二醇 现在我知道这不是一个大问题,但在编写成千上万行代码时,有intellisense在身边是很好的,特别是如果其他不太熟悉代码的程序员正在提供帮助的话 我知道存在工作单元模式,但在我看来,当涉及EF时,这是魔鬼自己
或者我们不注射?首先,我认为“注射”这个词可能有一些误解 这意味着:
public class UserService
{
MyContext _db;
public UserService(MyContext db)
{
_db = db;
}
public void GetUserById(string id)
{
_db.Users.First(x => x.Id = id);
}
}
与此相反:
public class UserService
{
MyContext _db = new MyContext();
public UserService()
{
}
public void GetUserById(string id)
{
_db.Users.First(x => x.Id = id);
}
}
注意在第一个示例中,MyContext
是如何“注入”到构造函数中的。在第二个示例中,UserService
本身创建了MyContext
的一个新实例
现在,你应该吗?我相信你应该这样做,事实上,这是一种公认的良好做法。在此之前,请务必阅读并在几个示例项目中试用它,以了解它给您带来的好处 不知道你有什么问题。如果您使用dbcontext代码生成的代码,那么您应该具有.Users.Yes,如第二个示例所示。但是,如果使用注入,则必须使用DbContext基类,而不是它们生成的基类。请查看本文:对不起,是的,我知道注入是什么(尽管我应该说清楚)。然而,注入导致必须使用基类或接口(否则会有什么意义?),因此我提出了一个问题。@coolblue2000啊,我看到了这个问题。不,“注入”并不意味着使用基类。您可以插入“键入的”上下文,这没有问题。更大的对话是“我们应该依赖于具体还是抽象?”这是一个更难的问题:PYep,尽管可以注入具体类型,有什么意义呢?因为您并不比简单地将具体类型定义为非注入依赖项更好……@coolblue2000没有抽象的“注入”事件仍然有好处。对于测试,您仍然可以创建“双重测试”,它还可以帮助您在更高的级别上管理对象生命周期,并且创建对象也可以提供帮助。
public class UserService
{
MyContext _db;
public UserService(MyContext db)
{
_db = db;
}
public void GetUserById(string id)
{
_db.Users.First(x => x.Id = id);
}
}
public class UserService
{
MyContext _db = new MyContext();
public UserService()
{
}
public void GetUserById(string id)
{
_db.Users.First(x => x.Id = id);
}
}