__TransparentProxy如何工作?

时间:2013-05-22 08:20:28

标签: c# wcf proxy

使用WCF时,我们可以定义服务合同:

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

假设我在www.example.com/MyService打开一个服务主机,然后从我的客户端使用此服务的一种方法是

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

所以不知怎的,service实现了IMyService,尽管从未明确地做过。如果我调试这些行,我可以看到service__TransparentProxy的实例。从源代码中可以看出,该类中的注释表示

  

透明代理神奇地会创建一条消息,代表对其的调用,并委托Real代理执行真正的远程处理工作。

对我而言,这确实是“神奇的”,但我想必须有一个合乎逻辑的解释。


这里的模式非常有用。我想要的是下面的Magic类(语法不正确,我知道,否则我不需要问)。为了论证,让我们说我希望这个类打印出名为的方法名称。

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

这样我就可以打电话了

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

这将打印出来:

MyOperation

这样的事情可能吗? (应该是,因为__TransparentProxy做了类似的事情。)如果是这样,这将如何运作?

2 个答案:

答案 0 :(得分:2)

有一些关于Codeplex的文章尝试做类似于WCF的内容:

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

System.Reflection.Emit命名空间是底层密钥,可用于在代码中动态创建.NET程序集和类型。

答案 1 :(得分:0)

碰到这个答案的人可能都想看一下面向方面的编程(AOP)

也许还有PostSharp:https://www.postsharp.net/aop.net