【问题标题】:Inject Entity Framework DbContext using Ninject in ASP.NET MVC5在 ASP.NET MVC5 中使用 Ninject 注入实体框架 DbContext
【发布时间】:2016-12-27 15:11:09
【问题描述】:

我刚刚踏入依赖注入的世界。

我有以下自定义 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;
     }
}

【问题讨论】:

    标签: entity-framework asp.net-mvc-5 ninject


    【解决方案1】:

    首先,您应该避免方法注入。相反,使用构造函数注入。换句话说:

    public abstract class BaseController : Controller
    {
        protected readonly DbContext context;
    
        public BaseController(DbContext context)
        {
            this.context = context;
        }
    
        ...
    }
    

    那么,就 Ninject 配置而言,它非常简单:

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

    【讨论】:

    • 因为依赖注入的全部意义在于具有依赖项的类不应该知道或关心它是如何实现的。如果您的控制器将了解SkyTrackerContext,那么它还不如自己更新它。
    • 好吧,非常感谢。但是为什么是 [Inject] 属性呢?抱歉,我是 DI 的新手。
    • 好吧,就像我说的,无论如何你都不应该使用它。 [Inject] 仅对方法注入是必需的,这通常是非常不受欢迎的。正如我所演示的,进行构造函数注入是首选方法。
    • 您可能没有正确安装 Ninject。它没有与控制器创建挂钩,因此您的上下文没有被注入。因此,MVC 尝试在没有任何构造函数参数的情况下对其进行新建,并且没有无参数构造函数可以做到这一点。
    • 假设SkyTrackerContext有一个属性public DbSet&lt;Track&gt; Tracks { get; set; },你怎么能创建像context.Tracks.Where(t=&gt;t.Id == 1);这样的链接查询?我同意依赖不应该知道或关心它是如何实现的,但它应该有一个有用的接口来与之通信。默认的 DbContext 不提供对实体的任何访问权限,或者是吗?
    猜你喜欢
    • 2016-12-12
    • 2016-04-19
    • 1970-01-01
    • 1970-01-01
    • 2016-11-08
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    • 2017-05-14
    相关资源
    最近更新 更多