4

我有這種情況,用戶沒有登錄的事實阻止了我的控制器的依賴關係的構建。如何解決應用了Authorize屬性的MVC控制器的雞蛋依賴解決方案?

[Authorize] 
class MyController : Controller 
{ 
    public MyController(MyService service) 
    { 
    } 
} 

class MyService 
{ 
    public MyService() 
    { 
     // requires information which only 
     // becomes known after the user logs in 
    } 
} 

我的問題是:我可以做一些事來引起MVC框架第一看看授權屬性和然後解決控制器實例?

上面會更理想對我來說比下面的任一:

  • 更改爲MyService到能夠處理用戶登錄之前創建的
  • 與注射Func鍵
  • 切換到服務點

理想情況下,我想翻轉MVC框架中的一個開關,它說:「在解析控制器之前,檢查你是否真的要使用它而不是t oss骨粉出來,由於缺乏授權和指導反正...」

+0

您在哪裏/如何注入服務? –

+0

您可以查看Mark Seeman關於實現抽象工廠的文章:http://blog.ploeh.dk/2012/03/15/ImplementinganAbstractFactory/它涵蓋了這種需求。只要工廠在注射根部定義,它不是真正的服務定位器。 –

+0

你可以指定你的依賴爲懶嗎?例如,autofac讓你注入懶惰。不知道有關統一 – ChaseMedallion

回答

4

我有這種情況的事實,即用戶沒有登錄阻止我的控制器的依賴關係的建設。

這就是問題的根源。

//需要只成爲

用戶登錄後知信息。這意味着該服務的構造函數太多。構造器不應該僅僅存儲傳入的依賴關係。這樣你可以compose object graphs with confidence

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

+1

+1非常好的答案。 –

+1

謝謝,這是很好的建議,並以這種方式思考可能會導致我的情況得到解決。如果沒有人能夠直接回答我的問題的具體工作,我肯定會回來並標記出答案。 –

+1

@AaronAnodide無需等待任何解決方法。只需通過將計算移至後期來解決問題。我們已經多次遭遇同樣的問題,現在已經進行了測試,以阻止開發者再次遇到這個問題。 – trailmax

1

你的問題是你並不真正瞭解MVC請求管道是如何工作的。

您必須認識到的第一件事是,本質上,屬性設計爲與控制器基類中的相同事件相匹配。 Controller中有一個OnAuthorization方法,它在調用屬性OnAuthorization方法之前或之後被調用。

因此,爲了在大致相同的時間調用兩種方法,這意味着Controller類必須已經構建完成。更重要的是,在授權過濾器之前還有許多其他內容,例如模型綁定,因爲您的授權過濾器可能需要來自模型的信息來做出決定。

我建議你看看這個Pipline圖表。

https://www.simple-talk.com/dotnet/.net-framework/an-introduction-to-asp.net-mvc-extensibility/