如果你了解factory設計模式,這篇文章可以不用看,只要會配置ihttphandlerfactory就可以,不了解也沒有關系,通過下面的文章你可以學會如何使用ihttphandlerfactory,同時還會明白factory設計模式的廣義定義
在前一篇專題中講解了httphandler在cs中的運用以及一些相關的話題。其實實現httphandler功能還有另外一個選擇就是handler factory(cs 中沒有用到handler factory),這是通過繼承ihttphandlerfactory接口來實現的。
ihttphandlerfactory接口的定義如下:
interface ihttphandlerfactory
{
ihttphandler gethandler(httpcontext ctx, string requesttype, string url,string pathtranslated);
void releasehandler(ihttphandler handler);
}
該接口中定義了2個方法,gethandler方法在請求開始的時候被調用,而releasehandler在請求結束,所有的handler都不再需要的時候被調用。
如何使用呢?大致有三個步驟:
1:定義實際處理httphandler的類(實現ihttphandler接口),這個類會在handlerfactory中被調用以進行業務處理,一個handlerfactory可以調用n個httphandler類(不然就不叫factory不是?。┻M行處理相關的業務邏輯。
2:定義handlerfactory,例:
public class myhandlerfactory : ihttphandlerfactory
{
public ihttphandler gethandler(httpcontext ctx,string requesttype,string url,string pathtranslated)
{
//處理邏輯,最后返回一個httphandler類
}
public void releasehandler(ihttphandler handler) {}
}
前一步說過,一個handlerfactory可以處理n個httphandler,什么時候該處理什么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的請求全都(*.asmx、error.aspx除外)轉交由一個ihttphandlerfactory入口統一處理。
2:從部署和松散耦合考慮,如果你的web application足夠大(我目前還沒有設計過這種大型app),你就要考慮在更換httphandler處理類的時候該不該去改動web.config的配置,這種改動將會重新啟動整個app,對于一些系統而言這是不可以隨便進行的。這個時候,統一一個入口的ihttphandlerfactory很重要,這個入口相對不變,而ihttphandler實現可以通過外掛自定義的xml文件來實現松散耦合,運用一些反射什么的就可以實現了。
如果對ihttphandlerfactory有其他見解的朋友請留下你的觀點。
新聞熱點
疑難解答