.NET上下文攔截
來源:互聯網
上載者:User
在.NET 中,上下文(Context)的概念貫穿著.NET的很多核心內容.他提供了類似運行環境的服務和內容.在.NET中,基於上下文攔截的技術一直是很隱晦 的,沒有很多的文檔說明。然兒,基於內容相關的攔截的技術卻提供了很好很強大的功能。使我們能方便是實作類別似 AOP 的編程模式。.NET3.0 中的WCF更是大量使用了上下文攔截技術。
在.NET 中,元件服務通常的顆粒是域(Domain)和上下文(Context).其中,在域中提供的服務通常只有'同步域'.當然,.NET 中也提供了很多COM+服務,但需要被服務的組件(類)直接或間接繼承自ServicedComponent(被服務的組件)..NET中提供的COM+服務全部在命名空間System.EnterpriseServices中,在其中,提供了諸如訊息佇列,即時啟用,對象池...等服務.
在使用.NET 開發時,我們都知道我們使用任何一種.NET支援的語言編寫的代碼都是Managed 程式碼.所謂Managed 程式碼產生的IL語言只能運行在CLR中.並且享受CLR提供的垃 圾回收,託管堆...等.但是,Windows在為我們的IL運行提供一個進程時,並不知道所謂的託管環境,Windows只負責提供進程,在進程中沒有 託管環境的概念.在Windows 進程和IL之間,域提供了橋樑的作用。在Windows進程中,所有域共用CLR提供的諸如記憶體回收,託管堆,和JIT,載入和卸載程式集等服務。也就是 說,我們所有的IL代碼必須運行在域中,當然,當我們啟動一個.NET程式時,會建立一個預設的域來載入和運行我們的.NET程式,並提供託管堆。我們也 可以建立新的域。所以,每個Windows 進程可以宿主多個域。在.NET中,對象是不能夠跨域直接引用的,每個.NET對象都是他所屬的域所屬的託管堆被建立的。對象的跨域訪問,必須使用代理 (Proxy),並且對象是可以被封送的(直接或間接繼承自MarshalByRefObject),跨域訪問對象就是所謂的遠端存取(Remoting)。
在.NET中域的粒度仍然很大,如果我們不顯式的建立新的域,通常我們程式中的所有組件(類),都運行在同一個域中。在.NET中,上下文(Context),提供了比域粒度更小的運行環境。域可以有多個上下文,但一個上下文只能屬於一個域。
和域一樣,我們的 .NET組件(類)也必須運行在不同的上下文中,只不過不同的上下文提供不同的上下文服務,每個域中也有一個預設的上下文,預設的上下文但是不提供任何的 服務。上下文最大的好處是讓我們可以使用上下文攔截技術,為被宿主在內容相關的組件(類)提供自訂的服務。這樣,我們就可以實現所謂AOP編程。我們可以 把AOP中所謂的管道工作作成服務,添加到上固定的下文服務中,這樣每個對這個上下文中的組件(類)的調用,都將被攔截,然後把服務(管道方法)添加到組 件(類),就好象把服務(管道方法)織入(AOP術語)到組件(類)中.