展示 WF4 如何使用 WCF 服務,並由 Silverlight 非同步呼叫,後端以 Linq to SQL 存取 Northwind 資料庫,呈現三層級聯 (客戶 → 訂單 → 明細)。
使用 Pick 活動提供多個服務端點,每分支對應一個 ReceiveAndSendReply:
// 取得所有客戶
public sealed class GetCustomersActivity : CodeActivity
{
public OutArgument<List<Customer>> CustomerList { get; set; }
protected override void Execute(CodeActivityContext context)
{
var dc = new DataClasses1DataContext();
CustomerList.Set(context, dc.Customers.ToList());
}
}
// 依客戶 ID 取得訂單
public sealed class GetOrdersActivity : CodeActivity
{
public InArgument<string> customerID { get; set; }
public OutArgument<List<Order>> OrderList { get; set; }
protected override void Execute(CodeActivityContext context)
{
var dc = new DataClasses1DataContext();
var id = customerID.Get(context);
OrderList.Set(context, dc.Orders.Where(o => o.CustomerID == id).ToList());
}
}
// 依訂單 ID 取得明細
public sealed class GetOrderDetailsActivity : CodeActivity
{
public InArgument<int> orderID { get; set; }
public OutArgument<List<Order_Detail>> OrderDetailList { get; set; }
protected override void Execute(CodeActivityContext context)
{
var dc = new DataClasses1DataContext();
var id = orderID.Get(context);
OrderDetailList.Set(context, dc.Order_Details.Where(d => d.OrderID == id).ToList());
}
}
private void lstCustomers_Loaded(object sender, RoutedEventArgs e)
{
var svc = ServerManager.GetPox();
txtStatus.Text = "Loading customers...";
svc.GetCustomersCompleted += svc_GetCustomersCompleted;
svc.GetCustomersAsync();
}
void svc_GetCustomersCompleted(object sender, GetCustomersCompletedEventArgs e)
{
if (e.Error == null)
{
lstCustomers.ItemsSource = e.Result;
txtStatus.Text = string.Empty;
}
else
txtStatus.Text = "Error loading customers...";
}