silverlight:[Silverlight]摆脱对 ServiceReferences.ClientConfig 的依赖

  在 Silverlight 中如果用 VS添加对 WCF Service, 引用则会自动生成 ServiceReferences.ClientConfig 配置文件其中包含该 Service Binding 和 Address 等信息将配置信息隔离出来本来是好事情但问题是由于 Silverlight 只是个客户端 runtime 特性决定配置文件将被在编译时组装到 Siverlight xap 压缩包中去这样修改配置就会变得很麻烦每次要修改后重新编译重新部署而由 VS 生成这个 config 文件中往往包含了对 Service 所在地址直接引用比如 http://localhost:123/SomeService.svc这样对我们部署到生产环境是非常不方便

  换个做法如果我们能将承载 Silverlight 页面跟 WCF Service 放到同个网站WebSite中这样就可以用相对地址来访问到 Service. 在开发环境/测试环境/生产环境的间迁移就会变得很方便

  这时该网站WebSite下文件结构大致如下:


|_ Service1.svc
|_ Service2.svc
|_ ...
|_ ClientBin
      |_ YourSilverlightApp.xap


  其中 ClientBin 下是编译生成 Silverlight xap 包

  根据这个结构我们就可以做个 WcfServiceClientFactory 类可以按需创建出指定类型 WCF 客户端代理类而不用去读取配置文件代码如下:

using;
using.Net;
using.Windows;
using.Windows.Controls;
using.Windows.Documents;
using.Windows.Ink;
using.Windows.Input;
using.Windows.Media;
using.Windows.Media.Animation;
using.Windows.Shapes;
using.ServiceModel;
using.ServiceModel.Channels;
NeilChen.Silverlight
{
  publicWcfServiceClientFactory<TServiceClient,TService>
    whereTServiceClient:ClientBase<TService>,TService
    whereTService:
  {
    publicTServiceClientCreateServiceClient
    {
      vartypeName=typeof(TService).Name;
      varserviceAddress="../"+typeName+".svc";
      CreateServiceClient(serviceAddress);
    }
    publicTServiceClientCreateServiceClient(serviceAddress)
    {
      varendpoAddr=EndpoAddress(Uri(Application.Current.Host.Source,serviceAddress));
      varbinding=BasicHttpBinding;
      varctor=typeof(TServiceClient).GetConstructor(Type{typeof(Binding),typeof(EndpoAddress)});
      (TServiceClient)ctor.Invoke(object{binding,endpoAddr});
    }
  }
}


  这样就可以利用类似下面代码来创建客户端代理:

  varmemberService=WcfServiceClientFactory<MemberServiceClient,

  MemberService>.CreateServiceClient;

  比起直接用 方式创建多传了两个类型参数而已但是却不需要依赖于配置文件了

  至于上面提到 WCF Service 跟 Silverlight 集放置这个特定结构其实也不定要这样用上面提供第 2个重载形式 publicTServiceClientCreateServiceClient(serviceAddress) 就可以指定其他情况相对地址当然如果定要用绝对地址增加个类似思路方法就可以了这里我省略了

  不过我个人而言比较喜欢这种结构合理约定就会省去很多编程和配置麻烦

  Ruby on Rails 哲学不是有个叫做“约定胜于配置”么

Tags:  silverlight2 silverlight.2.0 silverlight是什么 silverlight

延伸阅读

最新评论

发表评论