技术开发 频道

Programming WCF Services:绑定的选择

    通过WCF实现SOA的一个关键问题是,如何将与技术无关的服务转换为CLR。一旦提供了这种转换,WCF的服务设计者与开发者就可以根据自己拥有的CLR的知识,进行WCF面向服务开发。为两者搭建桥梁的是宿主。一个宿主可以包含多个上下文,而在上下文中则可以包含服务实例。特殊的,宿主的上下文也可以为空。如下图所示:


    客户端若要调用服务,可以采用代理或通道的方式。这两种方式在很多资料上已经有了详尽的介绍。在这里,我不准备重复。如果需要详细了解甚至掌握着两种方式,当然可以购买Programming WCF Services一书一探究竟。这里我想介绍的是本书中频繁使用的一种简化WCF类库的一个示例,主要是引入泛型来简化以及各种步骤地自动化处理。例如ServiceHost<T>类,就是通过引入泛型简化了WCF提供的ServiceHost类:

public class ServiceHost<T> : ServiceHost { public ServiceHost( ) : base(typeof(T)) {} public ServiceHost(params string[] baseAddresses) : base(typeof(T),Convert(baseAddresses)) {} public ServiceHost(params Uri[] baseAddresses) : base(typeof(T),baseAddresses) {} static Uri[] Convert(string[] baseAddresses) { Converter<string,Uri> convert = delegate(string address) { return new Uri(address); }; return Array.ConvertAll(baseAddresses,convert); } }

    如果是使用ServiceHost类,则托管服务的代码如下所示:

public static void Main( ) { Uri baseAddress = new Uri("http://localhost:8000/"); ServiceHost host = new ServiceHost(typeof(MyService),baseAddress); host.Open( ); //Can do blocking calls: Application.Run(new MyForm( )); host.Close( ); }

    使用ServiceHost类,则可修改为:

public static void Main( ) { Uri baseAddress = new Uri("http://localhost:8000/"); ServiceHost<MyService> host = new ServiceHost<MyService>(baseAddress); host.Open( ); //Can do blocking calls: Application.Run(new MyForm( )); host.Close( ); }

    在ServiceHost<T>类的实现中,使用了.NET 2.0中才引入的一个方法Array.ConvertAll(),它的方法签名为:

public static TOutput[] ConvertAll<TInput,TOutput> ( TInput[] array, Converter<TInput,TOutput> converter )

    它能够根据Converter对象将一种类型的数组转换为另一种类型的数组。

0
相关文章