5

如果我有一个界面:

public interface ISomething
{
    void DoAThing();
}

然后我用 ChannelFactory 实例化它:

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

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

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

((IClientChannel)channel).Close

或者

((IChannel)channel).Close

或者

((ICommunicationObject)channel).Close

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

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

4

1 回答 1

2

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

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

于 2013-10-18T16:06:12.950 回答