0

ASP.NET與Unity結合時出現問題。今天,我的控制器的構造函數需要經過身份驗證的用戶擁有一些參數,如果主叫用戶通過身份驗證,則只能由Unity填充參數。如果我調用導致這樣的控制器UNAUTHENTICATED的URL,則ASP.NET MVC管道會嘗試創建控制器,並且由於所需的對象在容器中不存在,所以Unit會引發異常。對於我使用WSFederationAuthenticationModule和SessionAuthenticationModule的身份驗證,在web.config中,我將「Forms」配置爲身份驗證模式,以強制ASP.NET重定向到登錄頁面。我期望如果用戶未經身份驗證但是直接重定向到登錄頁面,則管道不會創建控制器實例。ASP.NET MVC創建需要身份驗證的控制器,儘管用戶未經身份驗證會導致依賴注入問題

+0

請參閱http://stackoverflow.com/q/4460702/10245 –

回答

0

我的控制器需要身份驗證的用戶的構造有一定的參數只能通過Unity一起填充如果主叫用戶進行身份驗證

那是你的問題的根源。這意味着該服務的構造函數做得太多了。構造器不應該僅僅存儲傳入的依賴關係。這樣你可以compose object graphs with confidence

對象圖的構建通常應該是靜態的。這意味着解析後的對象圖不應該根據運行時條件而改變(也有例外,但這是一個很好的經驗法則)。不管用戶是否被授權都不重要,服務類別仍應被組合和注入。這意味着數據的授權和加載將在稍後的時間點完成;實際執行請求的時刻(緊接在構成對象圖之後)。

因此,不要在構造函數中完成這項工作,請將此工作移至執行操作方法的時刻。您可以將此邏輯移至執行身份驗證的服務,使用過濾器屬性或使用裝飾器實現此功能。

+0

我的構造函數不會執行授權。已經有一個過濾器屬性(ON THE CONTROLLER!),並且此外還啓用了驗證功能。因此,我不明白爲什麼MVC運行時試圖創建控制器的實例,如果用戶未經身份驗證。所以呢?!我將稍後創建用戶特定的存儲庫實例,而不是使用構造函數注入。 –

+1

MVC本身只需從IControllerFactory中請求一個'IController'(並調用'.Execute'),並允許工廠返回任何東西(只要它實現'IController')。它是處理授權的'System.Web.Mvc.Controller'類,它只能在被調用時進行授權。 MVC不能自己執行授權,因爲它允許您完全替換授權機制。 – Steven