首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >__TransparentProxy是如何工作的?

__TransparentProxy是如何工作的?
EN

Stack Overflow用户
提问于 2013-05-22 08:20:27
回答 2查看 1.1K关注 0票数 3

在使用WCF时,我们可以定义一个服务契约:

代码语言:javascript
复制
[ServiceContract]
public interface IMyService
{
    [OperationContract]
    int MyOperation(int x);
}

假设我在www.example.com/MyService上打开了一个servicehost,那么从我的客户端使用这个服务的一种方法是

代码语言:javascript
复制
IMyService service =
    new ChannelFactory<IMyService>(new BasicHttpBinding(),
        new EndpointAddress("www.example.com/MyService")).CreateChannel();
int result = service.MyOperation(10);

因此,service以某种方式实现了IMyService,尽管这从来没有显式地实现过。如果调试这些行,我可以看到service__TransparentProxy的一个实例。正如您从源代码中看到的,该类中的注释说

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

对我来说,这的确是一种“魔法”,但我想必须有一个合乎逻辑的解释。

这里的模式可能非常有用。我想要的是像下面这样的类(语法不正确,我知道,否则我就不需要问了)。为了便于讨论,假设我希望这个类打印被调用的方法的名称。

代码语言:javascript
复制
public class Magic<T> : T {
    // don't know what to do here
}

所以我可以打电话给

代码语言:javascript
复制
IMyService service = new Magic<IMyService>();
service.MyOperation(10);

这个会印上:

代码语言:javascript
复制
MyOperation

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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程序集和类型。

票数 3
EN

Stack Overflow用户

发布于 2018-08-17 19:11:35

任何通过这个答案运行的其他人通常都可能希望查看面向方面编程(AOP)。

特别是PostSharp:https://www.postsharp.net/aop.net

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16686840

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档