我一直在研究新版本ASP的新功能.NET Identity 2.1及其增强功能之一是集成到OWIN中间件中的新IoC功能.

app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);

这句话接收一个函数委托,它返回示例中提供的manager实现的新实例:

 public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options,
        IOwinContext context)
    {
        var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>())); 

我个人不喜欢这个实现,因为我无法使用容器为这些管理者注入任何依赖项.

此外,还有一个"IdentityFactoryOptions"和一个"IOwinContext",它们"神奇地"注入到函数中,我无法将其拉出到我的IoC容器中.

有谁对此实现有更好的解决方法吗?

推荐答案

我从开箱即用的MVC5安装开始,并将AutoFac用作IoC容器.听起来我想要达到和你类似的目标,所以让我解释一下我都做了些什么.作为免责声明,我对使用IOC和身份认同相当陌生.

如果您使用自己的IOC,我认为IOwinContext在IOC角色中是不必要的-我切换到使用AutoFac注册我的ApplicationUserManager.要做到这一点,我必须:

从启动中删除CreateWinContext行.验证,因为我将在AutoFac中注册ApplicationDbContextApplicationUserManager.

//app.CreatePerOwinContext(ApplicationDbContext.Create);
//app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);

修改ApplicationUserManager构造函数参数,包括Create函数中的所有内容.

public ApplicationUserManager(IUserStore<ApplicationUser> store, IdentityFactoryOptions<ApplicationUserManager> options)
        : base(store)
{
    //all the code from the 'Create' function here, using `this` for `manager`
}

将AccountController设置为有一个以ApplicationUserManager为参数的构造函数,并放弃从OwinContext中获取ApplicationUserManagerUserManager属性.

private ApplicationUserManager _userManager; //every thing that needs the old UserManager property references this now
public AccountController(ApplicationUserManager userManager) 
{
    _userManager = userManager;
}

向AutoFac注册所有内容,包括IdentityFactoryOptions的实例.

var x = new ApplicationDbContext();
builder.Register<ApplicationDbContext>(c => x);
builder.Register<UserStore<ApplicationUser>>(c => new UserStore<ApplicationUser>(x)).AsImplementedInterfaces();
builder.Register<IdentityFactoryOptions<ApplicationUserManager>>(c => new IdentityFactoryOptions<ApplicationUserManager>()
{
    DataProtectionProvider = new Microsoft.Owin.Security.DataProtection.DpapiDataProtectionProvider("ApplicationName")
});
builder.RegisterType<ApplicationUserManager>();

这是粗略的总结.我可能错过了一路上必须做的其他一些调整.

Asp.net相关问答推荐

ASP.NET MVC项目中的产品采购并发性测试

Razor页面上@Foreach的正确语法,其中值可以等于多个值

页面刷新后如何存储JS Select 数据

如何从 JavaScript 调用 C# 函数?

Firefox 和 Chrome 之间 1 像素的行高差

某些黑客能否从用户那里窃取 Web 浏览器 cookie 并在网站上使用该名称登录?

self 跟踪实体与 POCO 实体

如何使用 jQuery 设置 outerHTML

如何使图像的一部分成为可点击的链接

如何通过后面的代码不显示

对于每个请求,RestClient 应该是单例还是新的

LINQ to Entities 无法识别 MVC 4 中的System.String ToString()方法

如何从 SQL Server 2008 本身获取客户端 IP 地址?

在 ApiController 中添加自定义响应头

根据 DropDownList 的值动态启用或禁用RequiredFieldValidator

c# list 如何在两个值之间插入一个新值

如何将参数传递给 ASP.NET MVC 2 中的自定义 ActionFilter?

ASP.NET 应用程序状态与静态对象

ASP.NET 核心,更改未经授权的默认重定向

连接字符串正确时出现实例失败错误