近期有个项目,使用的是WCF+Silverlight,所以自己先学习WCF基础,这里做一个简单的记录。
解决方案
搭建的基本系统框架如截图,Data部分是用的EF链接数据库,domain本来想使用域服务类,因为他会根据ORM产生的表生成增删改查功能,后来还是改为WCF,下面的两个是是使用了Telerik Silverlight搭建的页面,只包含简单的菜单和一个查询显示到GridView的操作,后面补一个争对telerik:RadGridView的学习篇。
WCF中引入Unity.WCF
首先在Survery.Domain中添加一个名为SurveryService的WCF,会自动生成两个文件:ISurveryService.cs 和SurveryService.cs, 协议部分: [ServiceContract],[OperationContract]等都在ISurveryService.cs中,SurveryService.cs 中直接实现Interface即可。我们在WCF 中添加一个简单的查询方法:
public IEnumerable GetSurveryList()
{
SurveryDbEntities surveryDb = new SurveryDbEntities();
try
{
return surveryDb.T_Survey.ToList().Select(s => new TSurvery()
{
AcquittanceId = s.AcquittanceId,
BackName = s.BackName,
BankAccount = s.BankAccount,
Company = s.Company,
CreateTime = Convert.ToDateTime(s.CreateTime).ToString("yyyy-MM-dd"),
Email = s.Email,
PhoneNo = s.PhoneNo,
TaxId = s.TaxId,
UserName = s.UserName,
id = s.id
});
}
catch (Exception ex)
{
throw ex;
}
}
TSurvery是业务需要自己添加的实体类,不做多解。
然后使用Nuget添加Unity.WCF。Unity.WCF其实也是继承Unity,针对WCF简化了使用方法,已经实现了ServiceHostFactory。其实也是需要RegisterType和Resolve。
具体使用方法:新增一个类命名为WcfServiceFactory,然后继承UnityServiceHostFactory,这时候需要去重写一个方法ConfigureContainer即可。具体代码如下:
public class WcfServiceFactory:UnityServiceHostFactory
{
protected override void ConfigureContainer(Unity.IUnityContainer container)
{
container.RegisterType();
}
}
服务寄宿
在完成以上工作后,需要对服务进行寄宿,我们是寄宿在项目“tkSurveryApp.Web”中,参考微软文档:Hosting the Data Service,以往在ASP.NET中直接添加WCF,会生成一个.svc文件,在<%@ ServiceHost %> 中会有CodeBehind属性,绑定的是WCF代码的文件。但是我们项目使用的WCF是在另一个类中,并且使用了依赖注入,所以我们要使用另一个属性Factory,Factory是用于创建寄宿服务的ServiceHost 的ServiceHostFactory。我们会指定到WcfServiceFactory上。修改Service指向寄宿服务的类型。具体代码如下:
<%@ ServiceHost Language="C#" Debug="true" Service="Survery.Domain.SurveryService" Factory="Survery.Domain.WcfServiceFactory" %>
Silverlight中使用WCF
在Silverlight中添加WCF时遇到一个坑,当时很久都没解决,这个坑的截图如下
提示无法导入,网上查找方法,最终解决方法是去掉图中那个勾,
最后客户端调用代码:
private void RadButton_Click(object sender, RoutedEventArgs e)
{
SurveryServiceClient client = new SurveryServiceClient();
client.GetSurveryListAsync();
client.GetSurveryListCompleted += client_GetSurveryListCompleted;
}
private void client_GetSurveryListCompleted(object sender, GetSurveryListCompletedEventArgs e)
{
rdData.ItemsSource = e.Result;
}
网页运行结果