MVC/nInject:实现我自己的 ApplicationUserManager

MVC/nInject: Implementing My Own ApplicationUserManager

我在 MVC4 应用程序中使用 nInject。我想实现我自己的 ApplicationUserManager 版本,因为脚手架创建了一个单独的数据库上下文实例(我使用 nInject 将请求范围数据库上下文注入到我的控制器中)。在 ApplicationUserManager 中有一个单独的数据库上下文在操作用户凭据时会导致一些奇怪的问题。

但是我 运行 在创建 nInject 绑定时遇到了问题:

private static void RegisterServices(IKernel kernel)
{
    kernel.Bind<CampaignDbContext>().ToSelf().InRequestScope();
    kernel.Bind<ApplicationUserManager>().ToSelf().InRequestScope();
    kernel.Bind<ApplicationSignInManager>().ToSelf().InRequestScope();
}        

第一个工作正常,大概是因为 CampaignDbContext 有一个无参数构造函数。

但是第二个和第三个都失败了。 ApplicationUserManager 的构造函数定义为:

public ApplicationUserManager( CampaignDbContext context )
    : base( new UserStore<CampaignDbUser>( context ) )
{
    // Configure validation logic for usernames
    UserValidator = new UserValidator<CampaignDbUser>(this)
    {
        AllowOnlyAlphanumericUserNames = true,
        RequireUniqueEmail = true
    };
    // etc

我认为因为 CampaignDbContext 本身是自绑定的,所以它的实例将被传递给 ApplicationUserManager 的构造函数。但根据我收到的错误消息,这似乎并没有发生。

如何配置 nInject 绑定?

ApplicationUserManager 应该继承自 UserManager<TUser>UserManager<TUser> 的构造函数采用 UserStore<TUser>,最后 UserStore<TUser> 的构造函数采用 DbContext.

与其尝试将上下文传递给首先应该依赖于它的 ApplicationUserManager,不如告诉 Ninject 如何实现 IUserStore<TUser>:

kernel.Bind<DbContext>().To<CampaignDbContext>().InRequestScope();
kernel.Bind(typeof(IUserStore<>)).To(typeof(UserStore<>)).InRequestScope();

然后,您只需将 ApplicationUserManager 注入到它需要去的地方,Ninject 将自动用一个 UserManager<TUser> 实例填充它,该实例是用您的 CampaignDbContext 初始化的。