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

时间:2015-04-18 03:48:01

标签: c# asp.net-web-api dependency-injection asp.net-identity

我有一个使用ASP.NET Identity进行身份验证/授权的ASP.NET Web API项目。我已经插入了我自己的自定义Identity实现,即我自己的UserStore与Azure Tables交谈,并删除了EF / SQL Server的东西。但是,我看到的大多数文档建议在Startup.Auth.cs类中创建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;
}

然而,创建一个&#34;新的CustomUserStore()&#34;在Startup.Auth.cs中是一种反模式,无法解析依赖关系。在创建UserManager时,解决此依赖关系的正确方法是什么?我要么不想要&#34;新的&#34;一个UserManagerFactory,或以某种方式解决内联依赖:

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

然后问题就变成了,如何获得单个IOC容器实例......

1 个答案:

答案 0 :(得分:1)

在global.asax或owin启动类中创建一个静态字段以保存ioc容器的引用,在容器引导程序设置中设置静态字段值。

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

Owin课程:

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>();

并获得您的依赖。