我有一种情况,我想使用Identity框架中的自定义UserStore。所以我的控制器看起来像这样。
public AccountController()
: this(new UserManager<ApplicationUser>(new MyUserStore()))
{
}
public AccountController(UserManager<ApplicationUser> userManager)
{
UserManager = userManager;
}
现在Simpleinjector不允许多个构造函数。它可以允许用一个构造函数注册这些类。当情况与上述情况类似时,我该如何解决这个问题。使用Simpleinjector注册。
答案 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对此发表评论。