WCF信道工厂接口与相关基类描述

开发 开发工具
WCF信道工厂定义了两个接口,分别为IChannelFactory和IChannelFactory< TChannel>。他们定义了WCF信道工厂最基本的属性与功能。

WCF开发框架中有一种叫做WCF信道工厂的东西。对于刚刚接触WCF不久的朋友可能对其还不太了解。由于信道管理器在客户端和服务端所起的不同作用,分为信道监听器和信道工厂。#t#

和服务端的信道监听其相比,处于客户端的信道工厂显得简单。从名称就可以看得出来,WCF信道工厂的作用就是单纯的创建用于消息发送的信道。我们先来看看与信道工厂相关的一些接口和基类的定义。

一、WCF信道工厂相关的接口和基类

对于信道监听器,WCF定义了两个接口:IChannelListener和IChnnelListener< TChannel>。与之相对地,WCF也为信道工厂定义了两个接口:IChannelFactory和IChannelFactory< TChannel>。这两个接口定义了信道工厂最基本的功能和属性,下面是这两个接口的定义:

  1. public interface IChannelFactory 
    : ICommunicationObject  
  2. {  
  3. // Methods  
  4. T GetProperty< T>() where T : class;  
  5. }  
  6. public interface IChannelFactory< TChannel> 
    : IChannelFactory, ICommunicationObject  
  7. {  
  8. // Methods  
  9. TChannel CreateChannel(EndpointAddress to);  
  10. TChannel CreateChannel(EndpointAddress 
    to, Uri via);  
  11. }  

由于WCF信道工厂的目的就是单纯的创建信道,所以IChannelFactory和IChannelFactory< TChannel>的定义显得格外简洁。两个重载的CreateChannel方法通过目的终结点的地址(to),以及在手工寻址下不同于目的终结点地址的另一个地址,该地址是消息实际会被发送的地址(via)。关于To和Via可以参考第二章关于物理地址和逻辑地址的部分。

除了上面的两个接口之外,WCF还定义分别是实现了它们的两个抽象基类:ChannelFactoryBase和ChannelFactoryBase< TChannel>。

ChannelFactoryBase继承自所有信道管理器的基类:CnannelManagerBase,而ChannelManagerBase又继承自CommunicationObject,实现ICommunicationObject接口定义的基本的状态属性和状态转换功能。并且实现了接口IChannelFactory和ICommunicationObject。而ChannelFactoryBase< TChannel>继承自CnannelManagerBase,并且实现了接口:IChannelFactory< TChannel>, IChannelFactory和ICommunicationObject。

一般地,范型类型TChannel为基于相应channel shape下客户端信道类型,比如IOutputChannel、IRequestChannel和IDuplexChannel。ChannelFactoryBase和ChannelFactoryBase< TChannel>的简单定义如下:

  1. public abstract class ChannelFactoryBase
     : ChannelManagerBase, IChannelFactory, 
    ICommunicationObject  
  2. {  
  3. ......  
  4. }  
  5. public abstract class ChannelFactoryBase
    < TChannel> : ChannelFactoryBase, IChannel
    Factory
    < TChannel>, IChannelFactory, 
    ICommunicationObject  
  6. {  
  7. ......  
  8. }   

 

二、案例演示:如何自定义WCF信道工厂

在上一个案例中,我们创建了一个自定义的信道监听器:SimpleReplyChannelListner。该信道监听器用于在请求-回复消息交换模式下进行请求的监听。在本案例中,我们来创建与之相对的信道工厂:SimpleChannelFactory< TChannel>,用于请求-回复消息交换模式下进行用于请求发送信道的创建。由于SimpleChannelFactory< TChannel>的实现相对简单,将所有代码一并附上。

SimpleChannelFactory< TChannel>直接继承自抽象基类SimpleChannelFactoryBase< TChannel>。字段成员_innerChannelFactory表示信道工厂栈中后一个信道工厂对象,该成员在构造函数中通过传入的BindingContext对象的BuildInnerChannelFactory< TChannel>方法创建。

OnCreateChannel是核心大方法,实现了真正的信道创建过程,在这里我们创建了我们自定义的信道:SimpleRequestChannel.。构建SimpleRequestChannel. 的InnerChannel通过­­­_innerChannelFactory的CreateChannel方法创建。对于其他的方法(OnOpen、OnBeginOpen和OnEndOpen),我们仅仅通过PrintHelper输出当前的方法名称,并调用­_innerChannelFactory相应的方法。

 

  1. public class SimpleChannelFactory< TChannel>
     : ChannelFactoryBase
    < TChannel> 
  2. {  
  3. public IChannelFactory< TChannel> _innerChannelFactory;   
  4. public SimpleChannelFactory(BindingContext context)  
  5. {  
  6. PrintHelper.Print(this, "SimpleChannelFactory");  
  7. this._innerChannelFactory = context.
    BuildInnerChannelFactory
    < TChannel>();  
  8. }   
  9. protected override TChannel OnCreateChannel
    (EndpointAddress address, Uri via)  
  10. {  
  11. PrintHelper.Print(this, "OnCreateChannel");  
  12. IRequestChannel innerChannel = this._
    innerChannelFactory.CreateChannel(address,
     via) as IRequestChannel;  
  13. SimpleRequestChannel. channel = new 
    SimpleRequestChannel.(this, innerChannel);  
  14. return (TChannel)(object)channel;  
  15. }   
  16. protected override IAsyncResult OnBeginOpen
    (TimeSpan timeout, AsyncCallback callback, 
    object state)  
  17. {  
  18. PrintHelper.Print(this, "OnBeginOpen");  
  19. return this._innerChannelFactory.BeginOpen
    (timeout, callback, state);  
  20. }  
  21. protected override void OnEndOpen(IAsyncResult result)  
  22. {  
  23. PrintHelper.Print(this, "OnEndOpen");  
  24. this._innerChannelFactory.EndOpen(result);  
  25. }   
  26. protected override void OnOpen(TimeSpan timeout)  
  27. {  
  28. PrintHelper.Print(this, "OnOpen");  
  29. this._innerChannelFactory.Open(timeout);  
  30. }  
  31. }   

 

责任编辑:曹凯 来源: 博客园
相关推荐

2010-02-22 15:00:02

WCF信道工厂

2010-03-02 18:01:07

WCF自定义消息筛选器

2010-02-22 15:06:31

WCF信道监听器

2009-12-07 18:33:31

WCF Service

2009-12-22 16:03:03

WCF异常

2021-10-17 18:54:40

Python定义使用

2010-02-26 16:20:56

WCF程序事务

2009-12-08 16:42:48

WCF Service

2009-12-07 15:02:46

WCF学习

2010-03-02 16:22:31

WCF状态应用

2009-08-20 19:08:49

ADODataRead

2010-03-01 09:19:10

WCF编码规范

2010-02-22 17:58:06

WCF异步上传

2010-02-22 14:53:17

WCF用户密码

2010-02-24 11:22:04

WCF方法重载

2010-02-25 13:40:17

WCF禁用安全配置

2010-02-23 17:30:41

WCF部署于IIS

2010-02-26 16:05:14

寄宿WCF服务

2010-03-01 16:31:58

WCF实现SOA

2010-02-25 13:54:48

WCF安全参数
点赞
收藏

51CTO技术栈公众号