我添加了UserStore的自定义实现。对于用户存储构造函数,我注入了UserRepository,如何使用简单的注入器容器注册它
我的代码就像
public class UserStore : IUserStore<User>, IUserLoginStore<User>, IUserPasswordStore<User>,
IUserSecurityStampStore<User>, IUserEmailStore<User>
{
private readonly IRepository<User> _userRepository;
public UserStore(IRepository<User> userRepository)
{
_userRepository = userRepository;
}
//other implementations
}
我的UserManager类
public class UserStoreManager<T> : UserManager<User> where T : class
{
public UserStoreManager(IUserStore<User> store) : base(store)
{
}
}
更新
我通过这样注册来尝试这个
container.Register<IUserStore<User>, UserStore>(Lifestyle.Scoped);
container.Register<UserManager<User>, UserStoreManager<User>>(Lifestyle.Scoped);
然后我得到了一个例外
答案 0 :(得分:1)
当我需要初始化UserStore
时,我只使用以下
container.RegisterPerWebRequest<IUserStore<User>>(() => new UserStore<User>((IRepository<User>)container.GetInstance<IRepository<User>>()));
UserStore
需要上下文的一个实例,但是只能使用GetInstance
来获取当前上下文,因为它是“在运行时计算的”,具体取决于Context生活方式
修改1
对于UserManager
,您需要执行以下操作:
container.RegisterPerWebRequest(() => new ApplicationUserManager(container.GetInstance<IUserStore<ApplicationUser>>(), DataProtectionProvider));
遵循与上述相同的原则。
DataProtectionProvider
是我的方法InitializeContainer
private static void InitializeContainer(Container container, IDataProtectionProvider DataProtectionProvider)
{
/* OMITTED */
container.RegisterPerWebRequest(() => new ApplicationUserManager(container.GetInstance<IUserStore<ApplicationUser>>(), DataProtectionProvider));
}
用于:
public static void InitializeInjector(this IAppBuilder app, IDataProtectionProvider DataProtectionProvider)
{
var container = new Container();
container.Options.DefaultScopedLifestyle = new WebRequestLifestyle();
container.Options.PropertySelectionBehavior = new PropertySelectionBehavior<InjectAttribute>();
InitializeContainer(container, DataProtectionProvider); // Here
app.UseOwinContextInjector(container);
app.MapSignalR(container);
container.RegisterMvcControllers(Assembly.GetExecutingAssembly());
container.Verify();
DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
BinderConfig.RegisterModelBinders(container);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters, container);
}
在
上调用public void Configuration(IAppBuilder app)
{
ConfigureAuth(app);
app.InitializeInjector(app.GetDataProtectionProvider());
}
因此,DataProtectionProvider
来自IAppBuilder