我最近對攔截概念很感興趣。我知道這個概念在NHibernate,Entity Framework等許多庫中都有使用。但我對如何在ASP.NET MVC Web應用程序中使用這個概念感興趣。在哪裏以及如何在Web應用程序中使用攔截器?
在Mvc Web應用程序中使用它有用嗎?
是否有任何使用攔截器的開源的Asp.Net Mvc項目?
Asp.net Mvc已經支持一種帶過濾器的控制器的攔截器。使用過濾器而不是攔截器更好?
我最近對攔截概念很感興趣。我知道這個概念在NHibernate,Entity Framework等許多庫中都有使用。但我對如何在ASP.NET MVC Web應用程序中使用這個概念感興趣。在哪裏以及如何在Web應用程序中使用攔截器?
在Mvc Web應用程序中使用它有用嗎?
是否有任何使用攔截器的開源的Asp.Net Mvc項目?
Asp.net Mvc已經支持一種帶過濾器的控制器的攔截器。使用過濾器而不是攔截器更好?
攔截可以用於很多事情 - 最顯着的解決橫切關注如儀器儀表,記錄,審計,安全,計量等
你don't need a DI Container to apply the concept,但它可以幫助。
您可以使用ASP.NET MVC過濾器實現大致相同的效果,但是爲什麼在應用通常可重用的實現時將自己限制在MVC框架中?
看看你開發一個以前的應用程序並檢查代碼。查找在方法和屬性開始或結尾處經常重複的代碼。這是你可能會考慮從所有這些方法轉移到攔截器的代碼。例如,我發現很多的執行輸入驗證我的MVC的行爲與代碼相同的同一對線這樣做:
if (!ModelState.IsValid)
return View(model);
這是有可能被移動到一個攔截器(可能是一個MVC過濾器代碼在這種情況下)。編寫和應用過濾器的成本是否超過了此重複代碼的成本? (2行代碼乘以控制器動作的數量)。在這種情況下,也許不是。然而,在其他情況下,使用攔截器的好處會更大。
下面是一些情況列表,我想這類型的代碼重複可能發生,即場景是氣味喜歡,他們可以從攔截受益:
using (var transaction = Session.BeginTransaction())
{
// ... do some work that is unique to this method ...
transaction.Commit();
}
AuthorizeAttribute
是一個正確的過濾器。Thread.Sleep
。Faulted
狀態,那麼您不能在Dispose
狀態下創建並銷燬客戶端實例的每種方法都需要檢查狀態,如有必要請致電Abort
,而不是簡單地在客戶端周圍環繞using
子句。在這種情況下,攔截器可能不是最合適的。這可能更容易to just fix the Dispose
implementation or use some kind of wrapper。無論上述例子是否適合攔截器,都取決於應用程序的獨特複雜性。這個清單當然不是詳盡的,也不可能。攔截器的可能應用與您編寫的應用程序一樣多樣。
我能想到的三個主要的地方,你可能想申請一個攔截器:控制器,服務和域對象。
有關如何完成所有這些的基本細節將取決於您使用的是哪些工具。
我會說你看看依賴注入,因爲它是一種更常用的術語,用於你正在尋找的功能。 – thekip
@thekip - 我知道這一點。所以我爲它添加了ioc標籤。 – AnyOne
這聽起來像你可能正在尋找[在.NET上的AOP](http://www.sharpcrafters.com/aop.net)。 –