3 回答

TA貢獻1801條經驗 獲得超16個贊
您應該完全避免將依賴項注入到屬性中。本文中對此原因進行了解釋:屬性中的依賴注入:請勿這樣做!??偠灾疚慕忉屨f:
構造函數的注入是不可能的,因為Attribute實例的創建不能被攔截。CLR處于控制之中。
屬性注入的使用很脆弱,因為它會導致時間耦合,應該避免。
將依賴項注入屬性使得無法驗證容器配置的正確性。
像MVC和Web API這樣的框架緩存了屬性,這使得很容易意外地創建引起錯誤的俘獲依賴性。
您有兩種選擇:
通過將數據(屬性)從其行為(服務)中分離出來,使屬性變為被動狀態,如參考文章和Mark Seemann的相關文章中所述。
如本答案所述,將您的屬性轉換為不起眼的對象。這意味著您:
從屬性提取所有邏輯到包含所有依賴項的自定義服務中。
在您的容器中注冊該服務。
讓屬性的方法(
AuthorizeCore
根據您的情況)只需要從服務定位器/ DependencyResolver解析服務并調用服務的方法即可。這里要注意的重要一點是,您不能進行構造函數注入,屬性注入,并且服務不能以屬性私有狀態存儲(如您已經注意到的)。
使用哪個選項:
如果您非常希望保持設計整潔,或者您需要使用這種方式應用多個屬性,或者要應用的屬性是在不依賴于System.Web的程序集中定義的,請使用選項1。 .Mvc。
否則,請使用選項2。

TA貢獻1906條經驗 獲得超10個贊
我一直在研究option1,如果您為要解析的dbcontext指定了InRequestScope(Ninject),則似乎無法使用它。否則,效果很好。我首先使用服務定位器(反模式)進行了嘗試,但解決了服務對象的創建問題。定制授權屬性的問題在于,它是在運行時創建的,并不遵循InRequestScope。如果我錯了,請糾正我。

TA貢獻1936條經驗 獲得超7個贊
請再次仔細閱讀選項1中提到的文章。在這種情況下,DbContext的生活方式是無關緊要的。屬性可以是單例,沒有任何問題,因為您無需向屬性中注入任何東西。該屬性只是數據。但是(一如既往),您必須確保操作篩選器服務的生存期短于或等于其依賴項,因為您將獲得專屬的依賴項。
- 3 回答
- 0 關注
- 526 瀏覽
添加回答
舉報