3

在使用 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);

所以不知何故,serviceimplements 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做了类似的事情。)如果是这样,这将如何工作?

4

2 回答 2

3

有几篇关于 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 程序集和类型。

于 2013-05-22T08:56:02.513 回答
0

遇到此答案的任何其他人都可能希望总体上查看面向方面的编程(AOP)

并且可能特别是 PostSharp:https ://www.postsharp.net/aop.net

于 2018-08-17T19:11:35.637 回答