2014-10-31 70 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