Asp.net-Mvc
如何解決 MVC 過濾器屬性中的依賴注入
我有一個從 AuthorizationAttribute 派生的自定義屬性類,它對控制器操作執行自定義安全性。OnAuthorizationCore 方法依賴於各種其他組件(例如 DAL),以判斷使用者是否可以呼叫操作。
我正在使用 Autofac 進行依賴注入。ExtensibleActionInvoker 聲稱能夠在動作過濾器上執行屬性注入。在執行時設置屬性的屬性(這似乎是個壞主意)將在簡單的單元測試中起作用,但在繁忙的多執行緒 Web 伺服器中它必然會出錯,因此這種想法似乎是一種反模式。因此這個問題:
如果我的 AuthorizationAttribute 依賴於其他組件才能正常工作,那麼它是正確的
$$ architecture $$模式才能達到這個目的? 即 AuthorizationAttribute 依賴於 IUserRepository…這種關係應該如何解決?
ExtensibleActionInvoker 聲稱能夠在動作過濾器上執行屬性注入。
正確 - 但不要將操作過濾器與可能無法實現它們的屬性混淆。在 ASP.NET MVC 中處理此問題的最簡潔方法是拆分職責,即使 MVC 框架允許您將它們組合起來。
例如,使用一對類——一個只保存數據的屬性類:
// Just a regular old attribute with data values class SomeAttribute : Attribute { ... }還有一個注入了依賴項的過濾器:
// Gets dependencies injected class SomeFilter : IActionFilter { ... }
SomeFilter``SomeAttribute只需使用從控制器或操作方法獲取屬性的典型方法GetCustomAttributes()來完成所需的任何工作。然後,您可以使用
ExtensibleActionInvoker連接過濾器:builder.RegisterControllers(...).InjectActionInvoker(); builder.RegisterType<ExtensibleActionInvoker>().As<IActionInvoker>(); builder.RegisterType<SomeFilter>().As<IActionFilter>();它可能比使用屬性作為過濾器方法編寫的程式碼多一點,但從長遠來看,程式碼的質量會更好(例如,通過避免屬性的限制和服務定位器解決方案的笨拙.)