2014-10-31 74 views
6

默认WEP应用在VS 2013年“个人用户帐户”来与下面的代码的帐户控制:ASP.NET MVC身份默认实现

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参数传递给构造函数。我相信这里使用了依赖注入模式。 如果我是正确的,那么在Visual Studio解决方案中,我可以找到负责依赖注入的代码?

接下来的UserManager部分,为什么我们应该测试如果_userManager在控制器中设置为空?

回答

8

你已经发现了负责执行依赖注入的代码。 app.CreatePerOwinContext()是在Owin流水线中注册usermanager(创建usermanager的代理)的代码,它实际上只是一个保存在HttpContext中的字典。

您可以深入了解此机制在此blogpost中的工作原理。

关于你我完全理解的其他问题!为什么要检查是否注入了依赖项...?那么:这是因为Owin在这里被用作穷人的DI机制,您在默认项目模板中看到的实际上是一种具有service locator anti pattern气味的回退机制。因为使用Owin而不是像样的DI容器,所以MVC pipeling需要一个默认的构造函数,因此需要检查null和服务定位器。 MVC如何决定使用哪个构造函数对我来说不是很清楚。但是我发现usermanager有时会被注入,在其他场景中将会为null。可能是因为Owin上下文大部分时间只在创建帐户控制器后才可用。

虽然模板是开箱即用的,但它确实会移动我的眉毛,就像移动你的眉毛一样。所以我去了一个干净的实施一个体面的DI容器,并删除了大部分owin服务定位器的东西。

如果您有兴趣可以找到我的解决方案​​我在哪里使用Simple Injector。并且还有其他DI容器的解决方案here