Community Server專題五:IHttpHandlerFactory

Community Server專題五:IHttpHandlerFactory

如果你瞭解Factory設計模式,這篇文章可以不用看,只要會配置IHttpHandlerFactory就可以,不瞭解也沒有關係,通過下面的文章你可以學會如何使用IHttpHandlerFactory,同時還會明白Factory設計模式的廣義定義

在前一篇專題中講解了HttpHandlerCS中的運用以及一些相關的話題。其實實現HttpHandler功能還有另外一個選擇就是Handler Factory(CS 中沒有用到Handler Factory),這是通過繼承IHttpHandlerFactory接口來實現的。

IHttpHandlerFactory接口的定義如下:2個方法,GetHandler方法在請求開始的時候被調用,而ReleaseHandler在請求結束,所有的Handler都不再需要的時候被調用。

interface IHttpHandlerFactory

{

IHttpHandler GetHandler(HttpContext ctx, 
string requestType, string url,string pathTranslated);

void ReleaseHandler(IHttpHandler handler);

}

該接口中定義了

如何使用呢?大致有三個步驟:

1:定義實際處理HttpHandler的類(實現IHttpHandler接口),這個類會在HandlerFactory中被調用以進行業務處理,一個HandlerFactory可以調用NHttpHandler類(不然就不叫Factory不是!)進行處理相關的業務邏輯。

2:定義HandlerFactory,例:

public class MyHandlerFactory : IHttpHandlerFactory

{

public IHttpHandler GetHandler(HttpContext ctx,string requestType,string url,string pathTranslated)

{

//處理邏輯,最後返回一個HttpHandler類

}


public void ReleaseHandler(IHttpHandler handler) {}

}

前一步說過,一個

HandlerFactory可以處理NHttpHandler,什麼時候該處理什麼HttpHandler就在這裏的處理邏輯中實現,例如:以上一篇專題防盜鏈中說到的,你可以定義兩個IHttpHandler實現,分別處理對圖片與壓縮文件的請求。由於GetHandler方法中傳入了HttpContext的上下文,因此可以對上下文中的Url請求進行判斷,然後啓用不同的HttpHandler類。

3:在Web.Config文件中註冊這個HandlerFactory,註冊的方式與HttpHandler是一樣的。例:

<httpHandlers>

<add verb="*" path="*.*"

type
="MyNamespace. MyHandlerFactory, MyAssembly" />

</httpHandlers>

注意,這裏不要再對

HttpHandler進行配置了,無論你定義了多少IHttpHandler實例,只要他們是通過HttpHandlerFactory調用實現其功能,在這裏都不要去註冊它,不然就重複了。

IHttpHandlerFactory其實非常簡單,存在的思想就是Factory設計模式(Factory模式:利用給Factory對象傳遞不同的參數,以返回具有相同基類或實現了同一接口的對象,這裏指返回具有同一IHttpHandler接口的對象)

什麼時候你要使用IHttpHandlerFactory而不去使用IHttpHandler,我就個人的開發經驗做一下總結:

1:在一個項目中需要使用很多IHttpHandler的時候,而且對這些IHttpHandler判斷都重複做一個同樣的前期處理,如果防盜鏈的例子中對圖片和壓縮兩個不同HttpHandler的處理,但是他們對URL的判斷都是一致的,在.Text中使用了IHttpHandlerFactory,而不是IHttpHandler,對於URL的請求全都(*.asmxError.aspx除外)轉交由一個IHttpHandlerFactory入口統一處理。

2:從部署和鬆散耦合考慮,如果你的web application足夠大(我目前還沒有設計過這種大型app),你就要考慮在更換HttpHandler處理類的時候該不該去改動Web.config的配置,這種改動將會重新啓動整個app,對於一些系統而言這是不可以隨便進行的。這個時候,統一一個入口的IHttpHandlerFactory很重要,這個入口相對不變,而IHttpHandler實現可以通過外掛自定義的xml文件來實現鬆散耦合,運用一些反射什麼的就可以實現了。

如果對IHttpHandlerFactory有其他見解的朋友請留下你的觀點。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章