为Identity UserStore注入自定义实现

时间:2016-10-11 11:26:20

标签: c# asp.net-mvc simple-injector

我添加了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);

然后我得到了一个例外

enter image description here

1 个答案:

答案 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