【问题标题】:Code generation for ClientBase<TChannel> and ChannelFactory<TChannel>?ClientBase<TChannel> 和 ChannelFactory<TChannel> 的代码生成?
【发布时间】:2014-03-13 06:01:11
【问题描述】:

我正在研究 ClientBaseChannelFactory 的使用模式,但有一点我无法理解。

在大多数示例中,我们都有这种用法

public class MyClient : ClientBase<IMySvcContract>, IMySvcContract {

    // IMySvcContract Interface method
    public string MyOperation(int param)
    {
        return this.Channel.MyOperation(param);
    }
}

这是一个客户端通过通道调用服务方法的示例。然而,当我仔细观察时,ClientBase 没有任何MyOperation() 的实现,它只知道IMySvcContract 中定义的公共接口。

因此,当调用this.Channel.MyOperation() 时,它实际运行的是哪个代码块? 它是否在运行时生成了实现 TChannel 的代码?如果是这样,这种模式还能如何实现?”

编辑:在最简单的情况下,只有 2 个类实现了 ISvcContractClientServer。模式创建对象和类型转换为接口类型都没有意义,这是获取我所知道的实际代码的唯一可能方法。

编辑2:经过进一步研究,我现在了解到可以在运行时生成一个实现TChannel 接口的类。这种程度的运行时代码生成对我来说是新的。 Reference。结果,问题略有变化。

【问题讨论】:

    标签: c# wcf generics inheritance interface


    【解决方案1】:

    ClientBase 将您的服务合同作为类型参数接收,并通过Channel 属性公开此类型的实例。

    通道本质上是服务通信层的代理。

    此代理对象的实际生成发生在 CLR(而不是 .NET Framework 类库)的深处。我不确定 CLR 是如何生成代理的,但它是非常低级的东西。

    更新:

    我通过通道工厂跟踪代码到 RealProxy 类、System.Runtime.Remoting.RemotingServices 类 (mscorlib) 和实际工作的 extern CreateTransparentProxy 方法。

    我在发现这一点时学到了一些知识,我分享了这些知识,即 .NET Framework 中不存在“代码块”,这就是我所说的低级。

    【讨论】:

    • 这并没有提供问题的答案。问题是调用了哪个代码块,而您的答案是:我不知道。您课堂上的其他解释并未阐明问题。
    • @PatrickHofman:不同意,这是一个很好的答案,我 +1。 ChannelTChannel 类型,提供给泛型 ClientBase&lt;TChannel&gt; 的类型。该实现是使用反射和动态代码生成构建的(它实际上不是“低级”,但这听起来像是对某处自动发生的事情的一个很好的近似)。
    • @WiktorZychla:这就是我犹豫(最终没有)否决的原因。有一些很好的解释,但最后这个问题没有得到回答(你的评论已经更具体了)。如果 OP 想查看实际代码,此答案不会提供完整答案。
    • @PatrickHofman:据我所知,您无法真正看到实际代码,因为它是在运行时自动生成的。 ChannelFactory 执行此操作,您不能“步入”,因为在编译时没有可用的内容。
    • 其实我的问题有两部分:(1)看代码有没有; (2) 是否是代码生成技巧。经过进一步研究,我现在了解到可以在运行时生成一个实现 TChannel 接口的类。这种程度的运行时代码生成对我来说是新的。参考:philsversion.com/2009/08/12/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 2015-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多