Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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
Entity framework 在ASP.NET MVC5中使用Ninject注入实体框架DbContext_Entity Framework_Asp.net Mvc 5_Ninject - Fatal编程技术网

Entity framework 在ASP.NET MVC5中使用Ninject注入实体框架DbContext

Entity framework 在ASP.NET MVC5中使用Ninject注入实体框架DbContext,entity-framework,asp.net-mvc-5,ninject,Entity Framework,Asp.net Mvc 5,Ninject,我刚刚登陆依赖注入世界 我有以下自定义DbContext- public partial class SkyTrackerContext: DbContext { public SkyTrackerContext(): base() { Database.SetInitializer(new SkyTrackerDBInitializer()); } } 要在此基础控制器中插入SkyTrackerContext- public abstract clas

我刚刚登陆依赖注入世界

我有以下自定义DbContext-

public partial class SkyTrackerContext: DbContext
{
    public SkyTrackerContext(): base()
    {
        Database.SetInitializer(new SkyTrackerDBInitializer());
    }
}
要在此基础控制器中插入SkyTrackerContext-

public abstract class BaseController : Controller
{
    public BaseController() {}

    [Inject]
    public SkyTrackerContext MyDbContext { get; set; }
 }
样本使用-

public class LoginController : BaseController
{            
    public ActionResult ValidateLogin(Login login) 
    {
      var query = MyDbContext.Persons.Where(.....);
    }
}
我应该在NinjectWebCommon.cs中写些什么来注入这个上下文

private static IKernel CreateKernel()
{
    var kernel = new StandardKernel();
    try
    {
        kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
        kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();

        RegisterServices(kernel);
        return kernel;
     }
     catch
     {
         kernel.Dispose();
         throw;
     }
}
private静态IKernel CreateKernel()
{
var kernel=新的标准内核();
尝试
{
kernel.Bind().ToMethod(ctx=>()=>newbootstrapper().kernel);
kernel.Bind().To();
注册服务(内核);
返回内核;
}
抓住
{
Dispose();
投掷;
}
}

首先,应该避免方法注入。相反,使用构造函数注入。换言之:

public abstract class BaseController : Controller
{
    protected readonly DbContext context;

    public BaseController(DbContext context)
    {
        this.context = context;
    }

    ...
}
然后,就Ninject配置而言,它非常简单:

kernel.Bind<DbContext>().To<SkyTrackerContext>().InRequestScope();
kernel.Bind().To().InRequestScope();

因为依赖项注入的整个要点是,具有依赖项的类不应该知道或关心它是如何实现的。如果您的控制器将了解
SkyTrackerContext
,那么它也可以自己更新它。非常感谢。但为什么[注入]属性呢?对不起,我是DI的新手。好吧,就像我说的,你无论如何都不应该使用它<代码>[Inject]仅对方法注入是必需的,这在一般情况下是非常不受欢迎的。正如我所演示的,进行构造函数注入是首选方法。您可能没有正确安装Ninject。它没有连接到控制器创建中,因此您的上下文没有被注入。因此,MVC尝试在没有任何构造函数参数的情况下重新创建它,并且没有无参数的构造函数可以使用?我同意依赖项不应该知道或关心它是如何实现的,但它应该有一个有用的接口来进行通信。默认的DbContext不提供对实体的任何访问,或者它是否提供了对实体的访问?