Entity framework 在ASP.NET MVC5中使用Ninject注入实体框架DbContext
我刚刚登陆依赖注入世界 我有以下自定义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
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不提供对实体的任何访问,或者它是否提供了对实体的访问?