嗨,我一直在尝试用SimpleInjector 注册预制标识类ApplicationUserManager中的默认IUserStore
public class ApplicationUserManager : UserManager<ApplicationUser, int>
{
public ApplicationUserManager(IUserStore<ApplicationUser, int> store)
: base(store)
{
}
我在App_Start文件夹中有一个SimpleInjectorInitializer文件,看起来像这样:
public static class SimpleInjectorInitializer
{
public static void RegisterDependencies(Container container)
{
container.Register<ICatalogRepository, CatalogRepository>();
container.Register<IUserRepository, UserRepository>();
container.Register<ICatalogService, CatalogService>();
container.Register<IUserService, UserService>();
container.Register<IAdminService, AdminService>();
container.Register<AccountController>();
container.Register<ApplicationUserManager>();
//container.Register<CustomUserStore>();
//container.RegisterCollection(typeof(IUserStore<>), new[] { typeof(ApplicationUser) });
//container.Register<IUserStore<>, store>();
//container.RegisterPerWebRequest<IUserStore<ApplicationUser>>(() => new UserStore<ApplicationUser>(container.GetInstance<ApplicationDbContext>()));
container.Verify();
}
}
正如你所看到的,我已经尝试过几次通过查看类似的Stack Overflow问题来让它发挥作用,但它要么没有改变结果,要么出现语法错误。
当前单击应用程序主页上的登录按钮时,会抛出此错误:
ApplicationUserManager类型的构造函数包含参数名称为"store",类型为未注册。请确保IUserStore已注册,或更改ApplicationUserManager的构造函数。
如果寄存器ApplicationUserManager下面的两行被取消注释,则抛出以下错误:
中发生类型为"System.ArgumentException"的异常SimpleInjector.dll,但未在用户代码中处理
附加信息:提供的类型ApplicationUser没有实现IUserStore。
如有任何帮助,我们将不胜感激。
我回答了自己的问题。我使用了各种其他堆栈溢出问题,答案是编辑我的SimpleInjectorInitializer,如下所示:
public static class SimpleInjectorInitializer
{
public static void RegisterDependencies(Container container)
{
container.Register<ICatalogRepository, CatalogRepository>();
container.Register<IUserRepository, UserRepository>();
container.Register<ICatalogService, CatalogService>();
container.Register<IUserService, UserService>();
container.Register<IAdminService, AdminService>();
container.RegisterPerWebRequest<IUserStore<ApplicationUser, int>>(
() => new CustomUserStore(container.GetInstance<ApplicationDbContext>()));
container.RegisterPerWebRequest(
() => new UserManager<ApplicationUser, int>(
new CustomUserStore(
container.GetInstance<ApplicationDbContext>())));
container.Register(
() => HttpContext.Current.GetOwinContext().Authentication);
}
}
注意:container.Verify()
将阻止此解决方案工作,但它确实有效。我需要做进一步的研究,以找到在使用container.Verify()
时更好的方法。