在使用WCF时,我们可以定义一个服务契约:
[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的一个实例。正如您从源代码中看到的,该类中的注释说
透明代理神奇地创建了一条消息,该消息表示对其的调用,并委托真正的代理执行真正的远程处理工作。
对我来说,这的确是一种“魔法”,但我想必须有一个合乎逻辑的解释。
这里的模式可能非常有用。我想要的是像下面这样的类(语法不正确,我知道,否则我就不需要问了)。为了便于讨论,假设我希望这个类打印被调用的方法的名称。
public class Magic<T> : T {
// don't know what to do here
}所以我可以打电话给
IMyService service = new Magic<IMyService>();
service.MyOperation(10);这个会印上:
MyOperation这样的事有可能吗?(应该是这样,因为__TransparentProxy做了类似的事情。)如果是的话,这又如何运作呢?
发布于 2013-05-22 08:56:02
有几篇关于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程序集和类型。
发布于 2018-08-17 19:11:35
任何通过这个答案运行的其他人通常都可能希望查看面向方面编程(AOP)。
特别是PostSharp:https://www.postsharp.net/aop.net
https://stackoverflow.com/questions/16686840
复制相似问题