Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DbContext,注入还是不注入?_C#_.net_Asp.net Mvc_Entity Framework 6 - Fatal编程技术网

C# DbContext,注入还是不注入?

C# DbContext,注入还是不注入?,c#,.net,asp.net-mvc,entity-framework-6,C#,.net,Asp.net Mvc,Entity Framework 6,这很可能是一个有一百万个答案的问题,但它让我很烦恼 我有一个使用EF的mvc应用程序。现在,我是将DbContext注入到业务对象中,还是以其他方式 很明显,我可以注入它,但这样我就可以在类中使用DbContext,而不是类型化上下文。这意味着我没有智能感知,代码看起来不那么优雅 乙二醇 现在我知道这不是一个大问题,但在编写成千上万行代码时,有intellisense在身边是很好的,特别是如果其他不太熟悉代码的程序员正在提供帮助的话 我知道存在工作单元模式,但在我看来,当涉及EF时,这是魔鬼自己

这很可能是一个有一百万个答案的问题,但它让我很烦恼

我有一个使用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);
    } 
}