我如何配置 Ninject 以注入我的 DbContext 以便与 ASP.NET 身份框架一起使用?

How can I configure Ninject to inject my DbContext for use with ASP.NET Identity Framework?

我想使用 Ninject 注入我的 DbContext ASP.NET 身份框架。

目前我的 web.config 文件中有以下行:

<appSettings>
    <add key="owin:appStartup" value="OwinTest.Identity.OwinStart, OwinTest.Identity" />
</appSettings>

这会导致调用我的 OwinTest.Identity 项目中 class OwinStart 上的 Configuration() 方法。

这是我的 OwinStart class:

public class OwinStart
    {
        public void Configuration(IAppBuilder app)
        {
            app.CreatePerOwinContext<IMyContext>(this.GetDbContext);
            app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create);
            app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);

            app.UseCookieAuthentication(
                new CookieAuthenticationOptions()
                {
                    AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
                    LoginPath = new PathString("/Login")
                });
        }

        /// <summary>
        /// Gets an instance of the DbContext for OWIN
        /// </summary>
        /// <returns></returns>
        private IMyContext GetDbContext()
        {
            // Create dbcontext instance
            return new MyContext();
        }
    }

如您所见,我使用 new 关键字创建了 DbContext 的实例,而我真的想利用 Ninject 将我的 DbContext 注入其中。

我可以连接 Ninject 以在 OWIN 中注入我的数据库上下文吗?

我猜你在这里能做的最好的是:

DependencyResolver.Current.GetService<IMyContext>();

更新

在聊天中讨论该问题后,我们确定:

  • Owin 应用是自托管的,不引用 System.Web
  • 它与使用 Ninject.MVC
  • 的 MVC 应用程序是分开的

这基本上意味着DI容器不能在两者之间共享。应用程序的composition root应该尽可能靠近起点,这对于OWIN来说就是启动方法。

在这个特定的用例中,您在这个应用程序中没有从 ninject 中获得任何好处,因为您在组合根旁边实例化 DbContext。

链接的文章 trailmax 说:

Also this does not use our Unity container, this uses Owin for object resolution. We don’t want to mix Owin registrations with Unity registrations for many reasons (the biggest reason is lack of lifetime management between 2 containers).

因此,将 DI 容器与 owin 一起使用的主要优势在于,如果您已经在应用程序的其余部分使用它,并且希望 owin 和应用程序的其余部分共享注册。那不是你的情况。