使用带有IdentityFactory中间件的IOC容器

lab*_*roo 8 c# asp.net-identity

我试图理解UserManagerFactory中间件,这里解释了usermanager的每个请求生命周期管理.

我创建了这个我从Startup Configuration方法调用的类

public class CustomUserManagerProvider
{
    public static CustomUserStore<CustomUser> CreateCustomUserStore()
    {
        return new CustomUserStore<CustomUser>(/*Need to inject dependencies here*/);
    }

    public static CustomUserManager CreateCustomUserManager(IdentityFactoryOptions<CustomUserManager> options,
        IOwinContext context)
    {
        return new CustomUserManager(context.Get<CustomUserStore<CustomUser>>());
    }
}
Run Code Online (Sandbox Code Playgroud)

和启动配置

public void Configuration(IAppBuilder app)
    {
        app.CreatePerOwinContext(CustomUserManagerProvider.CreateCustomUserStore);
        app.CreatePerOwinContext<IngramUserManager>(CustomUserManagerProvider.CreateCustomUserManager);
        ////....Other things
    }
Run Code Online (Sandbox Code Playgroud)

现在,我的CustomUserStore有一些依赖项,我想在构造函数中注入.

IOC容器的组合根知道如何解决这些依赖关系.

如何CustomUserManagerProvider识别DI容器(如果有意义的话)......

虽然这有效

public static CustomUserStore<CustomUser> CreateCustomUserStore()
    {
        var dependency = DependencyResolver.Current.GetService<ISomeDependency>();          
        return new CustomUserStore<CustomUser>(dependency);
    }
Run Code Online (Sandbox Code Playgroud)

但是,我试图避免服务定位器(反)模式.这是我唯一的选择吗,这是对的吗?

我正在使用Ninject.

我只是在组合根中的requestScope中创建一个UserManager并注入到控制器中,这不是同一个东西吗?

在Web应用程序中,CreatePerOwinContext与创建InRequestScope相同吗?

Hao*_*ung 7

是的,如果您愿意,可以以不同的方式将UserManager注入控制器,没有什么需要使用CreatePerOwinContext/IdentityFactoryMiddleware.

  • Trailmax提供了有关如何将Identity项目模板转换为使用Unity for DI的模板的一步一步; http://tech.trailmax.info/2014/09/aspnet-identity-and-ioc-container-registration/他选择了几个陷阱,所以值得一读.即你不能完全删除所有app.CreatePerOwinContexts for UserManager.您仍然需要app.CreatePerOwinContext(()=> DependencyResolver.Current.GetService <ApplicationUserManager>()); 在Startup.auth中. (2认同)