MVC/nInject:实现我自己的ApplicationUserManager

Mar*_*ert 1 c# asp.net-mvc ninject asp.net-mvc-4

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

但是我遇到了创建nInject绑定的问题:

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

第一个工作正常,大概是因为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
Run Code Online (Sandbox Code Playgroud)

我认为因为CampaignDbContext本身是自绑定的,它的实例将传递给ApplicationUserManager的构造函数.但根据我得到的错误消息,似乎没有发生这种情况.

如何配置nInject绑定?

Chr*_*att 5

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();
Run Code Online (Sandbox Code Playgroud)

然后,你可以只注入ApplicationUserManager它需要去的地方,Ninject将自动用一个UserManager<TUser>用你的初始化的实例填充它CampaignDbContext.