2011-08-16 20 views
7

我最近對攔截概念很感興趣。我知道這個概念在NHibernate,Entity Framework等許多庫中都有使用。但我對如何在ASP.NET MVC Web應用程序中使用這個概念感興趣。在哪裏以及如何在Web應用程序中使用攔截器?

在Mvc Web應用程序中使用它有用嗎?

是否有任何使用攔截器的開源的Asp.Net Mvc項目?

Asp.net Mvc已經支持一種帶過濾器的控制器的攔截器。使用過濾器而不是攔截器更好?

+1

我會說你看看依賴注入,因爲它是一種更常用的術語,用於你正在尋找的功能。 – thekip

+0

@thekip - 我知道這一點。所以我爲它添加了ioc標籤。 – AnyOne

+0

這聽起來像你可能正在尋找[在.NET上的AOP](http://www.sharpcrafters.com/aop.net)。 –

回答

0

我會說你使用更通用的DI容器來注入你的依賴關係。這不僅會將依賴關係注入到控制器中,還會提供這些依賴關係的依賴關係,從而生成所有依賴對象的完整對象圖。

在前端使用DI容器也爲您的後端提供了更多的單元測試和鬆散耦合的良好機會。

+0

Heyy您還沒有透露任何有關攔截器的信息... – AnyOne

+0

我不知道攔截器無法提供任何與DI容器相對的功能嗎? – thekip

+0

我並沒有打算在我的問題中使用沒有DI容器的截取器。它只是含蓄的說明 – AnyOne

5

攔截可以用於很多事情 - 最顯着的解決橫切關注如儀器儀表,記錄,審計,安全,計量等

don't need a DI Container to apply the concept,但它可以幫助。

您可以使用ASP.NET MVC過濾器實現大致相同的效果,但是爲什麼在應用通常可重用的實現時將自己限制在MVC框架中?

12

在哪裏/何時使用攔截器

看看你開發一個以前的應用程序並檢查代碼。查找在方法和屬性開始或結尾處經常重複的代碼。這是你可能會考慮從所有這些方法轉移到攔截器的代碼。例如,我發現很多的執行輸入驗證我的MVC的行爲與代碼相同的同一對線這樣做:

if (!ModelState.IsValid) 
    return View(model); 

這是有可能被移動到一個攔截器(可能是一個MVC過濾器代碼在這種情況下)。編寫和應用過濾器的成本是否超過了此重複代碼的成本? (2行代碼乘以控制器動作的數量)。在這種情況下,也許不是。然而,在其他情況下,使用攔截器的好處會更大。

下面是一些情況列表,我想這類型的代碼重複可能發生,即場景是氣味喜歡,他們可以從攔截受益:

  • 輸入驗證如上圖所示( )。
  • 調試日誌記錄。您可以write an interceptor記錄每個方法調用的入口和出口。
  • 線程同步。你的問題是關於web應用程序的,但是如果你正在開發一個帶有MVP風格視圖的Windows應用程序,你可以應用一個攔截器來確保所有方法調用都被同步回UI線程。
  • 數據庫事務。我大多數的數據庫事務的代碼如下所示:

 

using (var transaction = Session.BeginTransaction()) 
{ 
    // ... do some work that is unique to this method ... 
    transaction.Commit(); 
} 

無論上述例子是否適合攔截器,都取決於應用程序的獨特複雜性。這個清單當然不是詳盡的,也不可能。攔截器的可能應用與您編寫的應用程序一樣多樣。

如何使用攔截器

我能想到的三個主要的地方,你可能想申請一個攔截器:控制器,服務和域對象。

  • 隨着MVC控制器,這是很有道理的,以繼續使用MVC's filters
  • 對於中間層服務,你會拿出你的IoC容器,過濾器是不是一種選擇(因爲它不是一個控制器),所以你應該使用interception features of your IoC container
  • 對於您的域對象,您通常使用構造函數直接實例化(如果它是新實體)或從您選擇的ORM中獲取(如果它是現有實體),則需要使用某種對象工廠而不是構造函數和instruct your ORM how to use the factory

有關如何完成所有這些的基本細節將取決於您使用的是哪些工具。

相關問題