换个做法如果我们能将承载 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 哲学不是有个叫做“约定胜于配置”么
最新评论