Asp.net mvc 5 ASp.net identity 2.0示例-控制器构造函数、DB构造函数和Owin中间件的重用

Asp.net mvc 5 ASp.net identity 2.0示例-控制器构造函数、DB构造函数和Owin中间件的重用,asp.net-mvc-5,asp.net-identity,Asp.net Mvc 5,Asp.net Identity,我已从此处引用的链接安装了asp.net identity 2.0示例: 还有一些关于样品和最佳实践的具体问题。我意识到这些样本是beta版的,因此这可以解释我的一些担忧\问题 1) 为什么大多数控制器构造函数(例如AccountController)都在其构造函数中引用UserManager类的实例。我看不到任何DI,控制器也有一个UserManager类型的公共属性,它从Owin上下文中获取该属性的缓存实例。这仅仅是(糟糕的)脚手架的产物,还是我遗漏了一些微妙的DI 2) 我希望使用其他特

我已从此处引用的链接安装了asp.net identity 2.0示例:

还有一些关于样品和最佳实践的具体问题。我意识到这些样本是beta版的,因此这可以解释我的一些担忧\问题

1) 为什么大多数控制器构造函数(例如AccountController)都在其构造函数中引用UserManager类的实例。我看不到任何DI,控制器也有一个UserManager类型的公共属性,它从Owin上下文中获取该属性的缓存实例。这仅仅是(糟糕的)脚手架的产物,还是我遗漏了一些微妙的DI

2) 我希望使用其他特定于应用程序的数据来扩充ApplicationUser和ApplicationDBContext。要获取当前ApplicationDBContext类的副本,似乎必须获取当前Owin上下文,然后从该上下文获取ApplicationDBContext的副本。这是正确的吗?我正在考虑使用ApplicationDBContext属性和UserManager属性创建基本控制器类,这些属性遵循AccountController中演示的模式,然后从中继承需要这些属性的控制器

3) 每个HTTP请求都需要applicationdbcontext的隐式假设是否有效?这不是浪费吗

4) 最后,我希望添加ApprovedByAdmin属性,该属性仅允许用户在其注册已获得管理员批准的情况下登录。我设想将此添加到applicationuser。基于登录方法的示例,通过UserManager类对各种属性进行检查,例如

UserManager.IsLockedOutAsync(user.Id))
UserManager.CheckPasswordAsync(user, password))
我不知道为什么这些都是作为单独的异步调用来完成的,但是由于我无法修改UserManager,我是否必须执行以下操作:

var user = await UserManager.FindByNameAsync(userName);

if(!user.ApprovedByAdmin)
{
    ....
}
我想这就是我现在所有的问题

  • AccountControllers采用UserManager,因此它是可测试的,并且如果需要的话很容易进行DI
  • 是的,您应该从OwinContext获取ApplicationDbContext,每个请求应该只有一个DbContext
  • 默认情况下,cookiemiddleware需要有一个db上下文来验证标识cookie是否有效,因此需要它。另外,创建db上下文不会增加太多开销,除非实际使用命中数据库的方法
  • 你在用户身上所做的一切都很好。通常,您可以使用ApplicationUserManager扩展UserManager,但只有在您希望在不更改应用程序代码的情况下灵活地交换UserStores时,才需要这样做。通常,这只会影响使用poco类上的导航属性编写LINQ查询之类的事情,poco类依赖于EF特定的延迟加载功能来工作

  • 答案很清楚。关于第3点-这是否意味着经常进行数据库检查以检查过期的用户cookie?第二个问题是关于第二点。如果我的存储库类都需要ApplicationDBContext(不一定用于usermanager),那么我是否应该尝试从Owin上下文中获取这些类。有没有一种简单的方法可以在没有基本控制器的情况下实现这一点。通常情况下,这将通过DI容器完成,但这里似乎使用Owin来部分完成。你能提供一个真实世界的样本吗?例如,Contoso应用程序是asp.net上MVC教程示例的基础。它可以配置数据库检查的频率(每30分钟一次可能是合理的默认设置)。是的,这基本上是一个穷人的DI,因为没有我们可以依赖的框架DI。在Asp.net的vnext中,这将通过DI完成。