使用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
做了类似的事情。)如果是这样,这将如何运作?
答案 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