2013-05-22 15 views
1

當使用WCF,我們可以定義一個服務合同:__TransparentProxy如何工作?

[ServiceContract] 
public interface IMyService 
{ 
    [OperationContract] 
    int MyOperation(int x); 
} 

假設我在www.example.com/MyService打開一個ServiceHost的,然後從我的客戶使用該服務的一個方法是

IMyService service = 
    new ChannelFactory<IMyService>(new BasicHttpBinding(), 
     new EndpointAddress("www.example.com/MyService")).CreateChannel(); 
int result = service.MyOperation(10); 

所以不知何故,service實施IMyService,雖然這從來沒有明確做過。如果我調試這些線路,我可以看到service__TransparentProxy的一個實例。正如你可以從源代碼中看到,在該類評論說

透明代理神奇創建一個代表它,並委託給真實代理調用做真正的遠程工作的消息。

對我來說這確實是'魔術',但我想必須有一個合理的解釋。


這裏的模式可能非常有用。我想要的是一些類如下面的Magic(語法不正確,我知道,否則我不需要問)。爲了爭論,讓我們說我希望這個類打印所調用方法的名稱。

public class Magic<T> : T { 
    // don't know what to do here 
} 

,這樣我就能夠調用

IMyService service = new Magic<IMyService>(); 
service.MyOperation(10); 

,這將打印:

MyOperation 

是這樣的可能嗎? (應該是,因爲__TransparentProxy做了類似的事情。)如果是這樣,這將如何工作?

回答

1

有跡象表明,嘗試做類似於WCF在幕後做了Codeplex上幾篇文章:

http://www.codeproject.com/Articles/43598/Emit-Proxy http://www.codeproject.com/Articles/5511/Dynamic-Proxy-Creation-Using-C-Emit

System.Reflection.Emit命名空間是基礎密鑰,可以用來動態在代碼中創建.NET程序集和類型。

+0

有趣!我會看看這些項目,看看他們是否可以提供我需要的功能:) –

+0

好的,這讓我朝着正確的方向發展!非常感謝! –