如何将依赖项注入自定义 Identity UserStore 实现?

How to injection dependencies into custom Identity UserStore implementation?

我有一个 ASP.NET Web API 项目使用 ASP.NET Identity for authentication/authorization。我插入了我自己的自定义身份实现,即我自己的 UserStore 以与 Azure 表对话,并删除了 EF/SQL 服务器内容。但是,我在那里看到的大多数文档都建议在 Startup.Auth.cs class 中创建一个 UserManagerFactory 实例,如下所示:

public static Func<UserManager<CustomIdentityModel>> UserManagerFactory { get; set; }
UserManagerFactory = () => new UserManager<CustomIdentityModel>(new CustomUserStore<CustomIdentityModel>());

我的 CustomUserStore 依赖于另一个项目中的存储库,我将其依赖注入到构造函数中。

private readonly IRepository _repo;

public CustomUserStore(IRepository repo)
{
    _repo = repo;
}

但是,在 Startup.Auth.cs 中创建 "new CustomUserStore()" 是一种反模式,无法解决依赖关系。创建 UserManager 时解决此依赖关系的正确方法是什么?我想要么不必 "new up" UserManagerFactory,要么以某种方式解决内联依赖关系:

new UserManager<CustomUserModel>(container.Resolve<IRepository>());

那么问题就来了,如何获取单个IOC容器实例...

在您的 global.asax 或 owin 启动 class 中创建静态字段以保存 ioc 容器的引用,在您的容器 bootstrap 设置中设置静态字段值。

之后您可以从某个地方访问 ioc 容器,在您的 Startup.Auth.cs class 中您可以读取 ioc 静态字段容器并初始化内联 UserStore。

欧文 Class:

public class Startup {

   public static IUnityContainer Container; //Static field for hold ioc container reference.


    public void Configuration(IAppBuilder app)
            {
                //Code Omitted for brevity

                Container = YourIoCContainerReference:
            }
    }
}

因此您可以进行内联初始化:

var repository = Startup.Container.Resolve<IRepository>();

并得到你的依赖。