VS 2013中带有“个人用户帐户”的默认Wep应用程序附带一个帐户控制器,其中包含以下代码:
public AccountController(ApplicationUserManager userManager, ApplicationSignInManager signInManager )
{
UserManager = userManager;
SignInManager = signInManager;
}
private ApplicationUserManager _userManager;
public ApplicationUserManager UserManager
{
get
{
return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
}
private set
{
_userManager = value;
}
}
和Startup.Auth.cs中的这一行
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
我想了解什么机制将userManager参数传递给构造函数。我相信在这里使用dependendy注射模式。 如果我是正确的,我可以在Visual Studio解决方案中找到负责依赖注入的代码吗?
接下来对于UserManager部分,如果_userManager在控制器中设置了,我们为什么要测试_userManager是否为空?
答案 0 :(得分:8)
你们已经找到了负责执行依赖注入的代码。 app.CreatePerOwinContext()
是用于在Owin管道中注册usermanager(创建用户管理器的委托)的代码,该管道实际上只是保存在HttpContext
中的字典。
您可以在此blogpost中深入了解此机制的工作原理。
关于你完全理解的另一个问题!如果注入依赖项,为什么要检查null?好吧:那是因为Owin在这里被用作穷人的DI机制,你在默认项目模板中看到的实际上是一个带有service locator anti pattern气味的回退机制。因为使用Owin而不是体面的DI容器,MVC管道需要一个默认的构造函数,因此需要检查null和服务定位器。 MVC如何决定使用哪个构造函数对我来说并不清楚。但我发现用户管理器有时会被注入,而在其他场景中则为null。可能是因为owin上下文大部分时间仅在创建Account控制器后可用。
虽然模板开箱即用,但它确实会移动我的眉毛,就像移动你的模板一样。所以我选择了一个不错的DI容器,并删除了大部分的owin服务定位器。
如果您感兴趣,可以找到我使用here的解决方案Simple Injector。还有其他DI容器的解决方案here