【问题标题】:How does the ChannelFactory<T>.CreateChannel work?ChannelFactory<T>.CreateChannel 是如何工作的?
【发布时间】:2013-09-12 09:20:13
【问题描述】:

如果我有接口:

public interface ISomething
{
    void DoAThing();
}

然后我用 ChannelFactory 实例化它:

var channel = new ChannelFactory<ISomething>().CreateChannel

我得到了一个可以使用的实例。

现在,要关闭它,我需要强制转换:

((IClientChannel)channel).Close

((IChannel)channel).Close

((ICommunicationObject)channel).Close

我的 ISomething 接口不继承任何这些接口。

那么 CreateChannel 方法返回了什么样的对象,它是如何构造一个能够实现在运行时才知道的接口的动态对象?

【问题讨论】:

  • 如果您喜欢使用 dotPeek 或 Reflector 等反编译器进行挖掘,您可以自己钻研兔子洞看看...
  • 我不认为它是一个dynamic 对象,只是一个生成的对象。在 .NET 中生成代码相对容易。

标签: c# wcf


【解决方案1】:

ChannelFactory.CreateChannel() 返回RealProxy 的实现,它是通常称为TransparentProxy 或“Remoting”的工具集的一部分,这是一种略微过时的pre-wcf 技术。为了创建实现接口的实际类,它归结为一个名为 RemotingServices.CreateTransparentProxy(...) 的内部框架级方法,我没有看过它,但它很可能是一个类构建器/发射器一些。

正如你所问的,你可能想自己做这样的事情。要在运行时实现接口,我推荐Castle Dynamic Proxy,它可以毫不费力地实现接口或抽象类。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-27
  • 2012-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多