WCF学习之自定义绑定元素,信道工厂和信道监听器

WCF的最成功之处在于对信道的处理上,它将原本很繁琐,层次结构众多的诸多网络协议通过集成到几个类中,然后再利用我们熟悉的终结点,契约,服务等概念来描述他们,微软能够做到这种高度抽象,真的很值得我们大家去学习。

在学习WCF的过程中,真正难以理解的并不是那些新意的概念,而使如何实现WCF的灵活性(即扩展),微软在构建WCF 的整体架构的时候,似乎刻意关注了这一点,我想这可能是它信息不足,他不知道这一新概念的推出是否会得到市场的追捧,毕竟,并不是每一个创新和改革都会成功。话转回来,WCF的扩展到底难在哪里了,我个人认为就是在保证系统高效率运行的前提下,同时保证有效的机动灵活性。些了这么多的代码,大家似乎也都明白了,我们一直都在找一个平衡点,那就是在效率和体积上的一个平衡点,在WCF这一技术平台上,微软在一次体现了他的技术实力,因为他做到了。

言归正传,在全局程序集的System.ServiceModel命名空间中,有三个附属的命名空间非常重要,非别是System.ServiceModel.Channel,System.ServiceModel.Dispatcher和System.ServiceModle.Description,由于本主体讨论的内容,那么首先从自定义绑定说起:

首先故名思意,绑定属于信道这一块,这是WCF终结点的三个必备因素之一,在前面的内容中已经谈到过一些关于绑定的基本内容。为了构建自定义的绑定,首先需要明确绑定的作用,绑定确定了信息传输的方式,无论是客户端,还是服务端都需要设置绑定。在新建自定义的绑定的时候必须继承自BindingElement类,BindingElement提供了为各种通道生成信道工厂和信道监听器以及传入和传出消息的绑定元素。既然绑定确定了信息传输的方式,那么到底服务端和客户端到底是如何接受和发送信息的了,既然有绑定确定,那么自然由绑定元素负责,不是说绑定元素为各种通道生成信道工厂和信道监听器吗?我想您已经猜到了,信道工厂有客户端的绑定创建,当客户端需要与服务器段通信时,通过绑定创建客户端信道工厂。而对于服务器端,则是通过创建信道监听器来监听客户端的请求。其实这些概念和模式您并不陌生,如果类比于HTTP协议来了解,可能逻辑模型会更清楚一些。下面是自定义绑定的代码:

 

1 /// <summary>
2 /// 继承自BindingElement,实现了判断能否创建新的信道工厂和信道监听器以及创建他们
3 /// </summary>
4   public class MyBindingElement: BindingElement
5 {
6 public MyBindingElement()
7 {
8 //绑定元素的构造函熟
9 }
10
11 public MyBindingElement(MyBindingElement binding)
12 {
13 //绑定元素的构造函熟
14 }
15
16 public override BindingElement Clone()
17 {

19 return new MyBindingElement(this);
20 }
21
22 public override T GetProperty<T>(BindingContext context)
23 {
24 return context.GetInnerProperty<T>();
25 }
26
27 public override bool CanBuildChannelFactory<TChannel>(BindingContext context)
28 {

30 if (typeof(TChannel) == typeof(IRequestChannel))
31 {
32 return context.CanBuildInnerChannelFactory<TChannel>();
33 }
34 else
35 {
36 return false;
37 }
38 }
39
40 public override bool CanBuildChannelListener<TChannel>(BindingContext context)
41 {

43 if (typeof(TChannel) == typeof(IReplyChannel))
44 {
45 return context.CanBuildInnerChannelListener<TChannel>();
46 }
47 else
48 {
49 return false;
50 }
51 }
52
53 public override IChannelFactory<TChannel> BuildChannelFactory<TChannel>(BindingContext context)
54 {
56 return (IChannelFactory<TChannel>)(object)new MyCustomChannelFactory<TChannel>(this,context);
57 }
58
59 public override IChannelListener<TChannel> BuildChannelListener<TChannel>(BindingContext context)
60 {
61 return(IChannelListener<TChannel>)(object)new MyCustomChannelListener<TChannel>(this,context);
63 }
64 }

自定义的绑定元素很多函数都是基函数中定义的需要重载的,大家也可以清楚的看到他里面的具体功能,主要就是为信道创建信道工厂和信道监听器,由于信道是有形状的,比如说单工通信,双工通信,半双工通信,具体对应到WCF中的什么类型,由于篇幅问题在此不作介绍。

还有一个问题就是怎么使用自定义的绑定了,在客户端比较简单,直接使用定义的类新建客户端代理就可以了。但是对于服务器端,则必须新建一个绑定元素扩展,将自定义的绑定元素的类型赋值给绑定扩展元素,然后通过绑定配置,在配置文件中实现,对于绑定元素扩展的代码如下:

 

代码
/// <summary>
/// 为了让配置文件接受新创建的BindingElement而新建的对象
/// </summary>
public class MyBindingElementExtension : BindingElementExtensionElement
{
public override Type BindingElementType
{
get
{
return typeof(MyBindingElement);
}
}

protected override BindingElement CreateBindingElement()
{
return new MyBindingElement();
}
}

 

 

 由于篇幅,关于自定义信道工厂和信道监听器下篇在来介绍。

posted @ 2010-07-02 14:04  justlife  阅读(624)  评论(0编辑  收藏  举报