我有一个使用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容器实例......
答案 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>();
并获得您的依赖。