我正在研究 ClientBase 中采用的使用模式和 ChannelFactory有一点我无法理解。
在大多数例子中,我们都有这种用法
public class MyClient : ClientBase<IMySvcContract>, IMySvcContract {
// IMySvcContract Interface method
public string MyOperation(int param)
{
return this.Channel.MyOperation(param);
}
}
这是一个客户端通过 channel 调用服务方法的例子。然而,当我仔细观察时,ClientBase
没有任何 MyOperation()
的实现,它只知道 IMySvcContract
中定义的公共(public)接口(interface)。
因此,当this.Channel.MyOperation()
被调用时,它实际运行的是哪一段代码? 它是否在运行时生成了实现 TChannel 的代码?如果是这样,还可以如何实现这种模式?”
编辑:在最简单的情况下,只有 2 个类实现了 ISvcContract
,Client
和 Server
。该模式创建对象和类型转换为接口(interface)类型是没有意义的,这是获得我所知道的实际代码的唯一可能方法。
编辑 2:经过进一步研究,我现在了解到可以在运行时生成一个实现 TChannel
接口(interface)的类。这种程度的运行时代码生成对我来说是新的。 Reference .结果,问题略有改变。
最佳答案
ClientBase
将您的服务契约(Contract)作为类型参数,并通过 Channel
属性公开此类型的实例。
channel 本质上是通信层服务的代理。
此代理对象的实际生成发生在 CLR 的深处(而不是 .NET Framework 类库)。我不确定 CLR 是如何生成代理的,但它是非常低级的东西。
更新:
我通过 channel 工厂跟踪代码到 RealProxy
类、System.Runtime.Remoting.RemotingServices
类 (mscorlib) 和外部 CreateTransparentProxy
实际完成工作的方法。
我从中学到了一些发现,并且我在 .NET Framework 中不存在“代码块”的意义上分享了这些知识,这就是我所说的低级。
关于c# - ClientBase<TChannel> 和 ChannelFactory<TChannel> 的代码生成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22370292/