近期有個項(xiàng)目不从,使用的是WCF+Silverlight藻丢,所以自己先學(xué)習(xí)WCF基礎(chǔ)把曼,這里做一個簡單的記錄杨帽。
解決方案
搭建的基本系統(tǒng)框架如截圖,Data部分是用的EF鏈接數(shù)據(jù)庫嗤军,domain本來想使用域服務(wù)類注盈,因?yàn)樗麜鶕?jù)ORM產(chǎn)生的表生成增刪改查功能,后來還是改為WCF型雳,下面的兩個是是使用了Telerik Silverlight搭建的頁面当凡,只包含簡單的菜單和一個查詢顯示到GridView的操作,后面補(bǔ)一個爭對telerik:RadGridView的學(xué)習(xí)篇纠俭。
WCF中引入Unity.WCF
首先在Survery.Domain中添加一個名為SurveryService的WCF沿量,會自動生成兩個文件:ISurveryService.cs 和SurveryService.cs, 協(xié)議部分: [ServiceContract]冤荆,[OperationContract]等都在ISurveryService.cs中朴则,SurveryService.cs 中直接實(shí)現(xiàn)Interface即可。我們在WCF 中添加一個簡單的查詢方法:
public IEnumerable<TSurvery> 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是業(yè)務(wù)需要自己添加的實(shí)體類钓简,不做多解乌妒。
然后使用Nuget添加Unity.WCF。Unity.WCF其實(shí)也是繼承Unity外邓,針對WCF簡化了使用方法撤蚊,已經(jīng)實(shí)現(xiàn)了ServiceHostFactory。其實(shí)也是需要RegisterType和Resolve损话。
具體使用方法:新增一個類命名為WcfServiceFactory侦啸,然后繼承UnityServiceHostFactory,這時候需要去重寫一個方法ConfigureContainer即可丧枪。具體代碼如下:
public class WcfServiceFactory:UnityServiceHostFactory
{
protected override void ConfigureContainer(Unity.IUnityContainer container)
{
container.RegisterType<ISurveryService, SurveryService>();
}
}
服務(wù)寄宿
在完成以上工作后光涂,需要對服務(wù)進(jìn)行寄宿,我們是寄宿在項(xiàng)目“tkSurveryApp.Web”中拧烦,參考微軟文檔:Hosting the Data Service忘闻,以往在ASP.NET中直接添加WCF,會生成一個.svc文件恋博,在<%@ ServiceHost %> 中會有CodeBehind屬性齐佳,綁定的是WCF代碼的文件。但是我們項(xiàng)目使用的WCF是在另一個類中债沮,并且使用了依賴注入炼吴,所以我們要使用另一個屬性Factory,F(xiàn)actory是用于創(chuàng)建寄宿服務(wù)的ServiceHost 的ServiceHostFactory秦士。我們會指定到WcfServiceFactory上。修改Service指向寄宿服務(wù)的類型永高。具體代碼如下:
<%@ ServiceHost Language="C#" Debug="true" Service="Survery.Domain.SurveryService" Factory="Survery.Domain.WcfServiceFactory" %>
Silverlight中使用WCF
在Silverlight中添加WCF時遇到一個坑隧土,當(dāng)時很久都沒解決提针,這個坑的截圖如下
提示無法導(dǎo)入,網(wǎng)上查找方法曹傀,最終解決方法是去掉圖中那個勾辐脖,
最后客戶端調(diào)用代碼:
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;
}
網(wǎng)頁運(yùn)行結(jié)果