WCF RIA Services使用DomainService提供数据访问等服务,如果在Silverlight中使用,只要设置了WCF RIA连接,就能自动生成数据访问的客户端代理类,这为我们开发提供了方便。
我们通常是建立一个Silverlight Bussiness Application的项目,其中包含一个Silverlight项目作为客户端,一个Web结尾的项目承载我们的Domain Service服务。
刚开始我还受用这种模式,数据访问那么的自然,没有多余的WCF请求代码。然而当我做第二个应用程序时,遇到了麻烦,我该如何重用第一个应用程序中已经写好的Domain Service呢?我首先想到了把我的SL连接到上一个Web项目,然而一个SL应用只能连接一个Web项目,我不想把所有代码都放在一个应用程序下面,并且如果我要连接的web项目不是我开发的,我又该怎么连接?然后,我想到了添加服务引用,就像WCF服务一样,然而Domain Service总是不被其他SL项目发现,需要配置web.config将Endpoints暴露出来,并且这样等于放弃了WCF RIA Services的优势。
最后,终于找到了解决方法:使用WCF RIA Service类库。然而类库并不能独立发布,必须在Web项目中承载后,才能供我们访问,这样我们的解决方案的结构应该是:
其中ShareRIAServices开头的俩项目是WCF RIA Service类库项目,一个用于供silverlight项目引用,一个供Web项目引用。
FistSilverlight.Web项目承载DomainSerive服务ShareRIAServices.Web,提供访问。
AnotherSLApp引用ShareRIAServices,其中包含了自动生成的客户端Proxy代码。并且包含在另一个应用AnotherWeb中.
由于URL路径不同,我们Context类需要指定DomainService的URL地址:
const string ServicePath = "http://localhost:52878/ShareRIAServices-Web-ShareDomainService.svc";
ShareRIAServices.Web.ShareDomainContext sc = new ShareDomainContext(new Uri(ServicePath));
服务的命名是名称空间+类名.svc,其中用“-”连接。
这样任何需要使用ShareRIAServices.Web中的DomainService服务的SL应用程序,只需要引用ShareRIAServices即可,如果是别人开发的,只需要引用ShareRIAServices.dll就行。