程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> WF4.0實戰(十九):Silverlight+WCF+WF+Linq結合的一個示例

WF4.0實戰(十九):Silverlight+WCF+WF+Linq結合的一個示例

編輯:關於.NET

概述:

這個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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved