概述:
這個Demo主要是為了闡述WF4中是如何使用WCF服務的,以及如何在Silverlight中調用WCF服務。因為即使用了Silverlight呈現UI,又用Linq訪問數據庫。故本文的名字為:“Silverlight+WCF+WF+Linq結合的一個示例”。如果你和我一樣,對WCF有點了解,就知道WCF能將很多方法放在一Uri中供大家調用。那如何將多個WF流程放在一個Uri中供你調用呢?答案就是使用一個Pick活動,Pick活動中可以有多個分支,對於Pick的每一個分支,你都可以設計一個流程,這種方式是非常有用的。好了,先看一下這個Demo實現了什麼功能,在說如何實現,最後總結,附代碼下載。
效果:
就是一個Silverlight的數據顯示的界面,使用了northwnd數據庫。左邊顯示所有的客戶。右邊上面是你選擇顧客的訂單。右邊的下面是這個訂單的詳細情況。效果有點類似三級級聯。
實現:
這個Demo一共有四個項目,如下圖:
項目說明:
1、DataOperate:主要是linq生成的代碼,用於數據庫操作。
2、MyFirstSilverlight:Silverlight項目,用於顯示UI。
3、MyFirstSilverlight.Web:asp.net項目,用於宿主Silverlight。
4、WFService:把WF+WCF的項目,用於實現業務邏輯。
我深信WCF+WF功能是十分強大的。本文只講述一下WCF+WF結合的WFService是如何實現的。Silverlight和Linq的部分,詳細見代碼。
WFService實現:
在Workflow模板下面,選擇新建一個WCF Workflow Service,命名為WFService。
在Service1.xamlx中刪除原有的活動,拖放一個Pick活動,並添加三個分支,如下圖。
新建三個CodeActivity,分別命名為:GetCustomersActivity、GetOrderDetailsActivity、GetOrdersActivity。
1、GetCustomersActivity:代碼如下:
public sealed class GetCustomersActivity : CodeActivity
{
public OutArgument<List<Customer>> CustomerList { get; set; }
protected override void Execute(CodeActivityContext context)
{
DataClasses1DataContext datacontext = new DataClasses1DataContext();
CustomerList.Set(context, datacontext.Customers.ToList());
}
}
這個活動返回所有的顧客資料。
2、GetOrdersActivity代碼如下:
public sealed class GetOrdersActivity : CodeActivity
{
public OutArgument<List<Order>> OrderList { get; set; }
public InArgument<string> customerID { get; set; }
protected override void Execute(CodeActivityContext context)
{
DataClasses1DataContext datacontext = new DataClasses1DataContext();
OrderList.Set(context,(from order in datacontext.Orders
where order.CustomerID == customerID.Get(context)
select order).ToList());
}
}
這個活動返回顧客為customerID的所有訂單。
3、GetOrderDetailsActivity代碼如下
public sealed class GetOrderDetailsActivity : CodeActivity
{
public OutArgument<List<Order_Detail>> OrderDetailList { get; set; }
public InArgument<int> orderID { get; set; }
protected override void Execute(CodeActivityContext context)
{
DataClasses1DataContext datacontext = new DataClasses1DataContext();
OrderDetailList.Set( context,(from orderdetail in datacontext.Order_Details
where orderdetail.OrderID == orderID.Get(context)
select orderdetail).ToList());
}
}
這個活動返回訂單編號為orderID的訂單詳情。
下面我們將這三個活動放在WF中流程中。
在Pick的Trigger中拖三個Receive活動,設置如下圖:
由於具體使用Linq的訪問數據庫的實現還是在GetCustomersActivity、GetOrderDetailsActivity、GetOrdersActivity中,將這三個活動,拖入相應的Action中。
創建方法的返回值:右擊Receive活動,選擇Create SendReply。這是會提示你已經將SendReply復制到剪貼板中,你只需把它們粘貼到相對的地方。如下圖:
這樣我們就定義好了這個WCF和WF的服務。
在Silverlight項目中,選擇添加服務引用,如下圖:
在MainPage.xaml.cs中添加下面引用代碼:
using MyFirstSilverlight.ServiceReference;
Silverlight中調用WCF服務,與普通程序調用WCF服務的不同,不是同步調用,而是異步調用,見下面代碼:
private void lstCustomers_Loaded(object sender, RoutedEventArgs e)
{
Service1Client svc = ServerManager.GetPox();
this.txtStatus.Text = "Loading customers...";
svc.GetCustomersCompleted += new
EventHandler<GetCustomersCompletedEventArgs>(svc_GetCustomersCompleted);
svc.GetCustomersAsync();
}
void svc_GetCustomersCompleted(object sender, GetCustomersCompletedEventArgs e)
{
if (e.Error == null)
{
this.lstCustomers.ItemsSource = e.Result;
this.txtStatus.Text = string.Empty;
}
else
{
this.txtStatus.Text =
"Error occured while loading customers from database";
}
}
Demo很簡單,其他項目的實現,詳細見代碼。
總結:
這篇文章主要闡述了如何在WF中使用WCF服務。以及如何在Silverlight中調用WCF服務。
代碼下載:http://files.cnblogs.com/zhuqil/MyFirstSilverlight.rar
出處:http://zhuqil.cnblogs.com