使用SimpleInjector为AccountController注册Identity Framework UserStore

时间:2014-04-08 09:40:23

标签: asp.net-mvc asp.net-mvc-4 dependency-injection asp.net-identity simple-injector

我有一种情况,我想使用Identity框架中的自定义UserStore。所以我的控制器看起来像这样。

public AccountController()
: this(new UserManager<ApplicationUser>(new MyUserStore()))
{
}
public AccountController(UserManager<ApplicationUser> userManager)
{
      UserManager = userManager;
}

现在Simpleinjector不允许多个构造函数。它可以允许用一个构造函数注册这些类。当情况与上述情况类似时,我该如何解决这个问题。使用Simpleinjector注册。

2 个答案:

答案 0 :(得分:5)

Simple Injector需要一个公共构造函数。如果您有多个,则无法确定在运行时使用哪一个。

解决方案是一个设计问题 - 为什么需要多个构造函数?这可以通过问自己来回答......

我是否希望SimpleInjector创建IUserStore的实例,还是应该手动完成?

我认为它是前者,因为如果不允许注入依赖项,它会使AccountController难以测试。

以下配置(通常存储在App_Start / SimpleInjectorInitializer.cs中)将允许IUserStore实例属于您的自定义类型:MyUserStore,如果构造函数需要这个实例,它将被注入到IUserManager中......

container.Register<IUserStore, MyUserStore>();    
container.Register<IUserManager<ApplicationUser>, UserManager<ApplicationUser>>();

答案 1 :(得分:0)

在对Baldy和Steven的建议之后我最终得到了解决方案:

public class ApplicationUserManager : UserManager<Users, Guid>
{
    public ApplicationUserManager(IUserStore<Users, Guid> Store)
        : base(Store)
    {        
    }
}

public class ApplicationUserStore 
    : UserStore<Users, Roles, Guid, UserLogins, UserRoles, Claims>,
    IUserStore<Users,Guid>
{
    public ApplicationUserStore(RemsContext Context)
        : base(Context)
    {          
    }
}

至于Simpleinjector Configuraiton,我已将上述内容注册为

container.RegisterPerWebRequest<DbContext, RemsContext>();

container.Register<UserManager<Users, Guid>, ApplicationUserManager>();
container.Register<RoleManager<Roles, Guid>, ApplicationRoleManager>();

container.Register<IUserStore<Users, Guid>, 
    UserStore<Users, Roles, Guid, UserLogins, UserRoles, Claims>>();
container.Register<IRoleStore<Roles, Guid>, RoleStore<Roles, Guid, UserRoles>>();

这是我的实现同样适用于RoleManager。调用上面的实现为

public AccountsController(ApplicationUserManager _userManager,
    ApplicationRoleManager _roleManager)
{
    this.UserManager = _userManager;           
    this.RoleManager = _roleManager;
}

如果方法正确,我想邀请@Steven和@Baldy对此发表评论。