如何将依赖项注入自定义 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>();
并得到你的依赖。
我有一个 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>();
并得到你的依赖。