WCF+WF雙劍合璧構建微軟的SOA系列(一):從一個簡單的Demo開始

作者: 麒麟  來源: 博客園  發布時間: 2010-11-02 14:21  閱讀: 4290 次  推薦: 0   原文鏈接   [收藏]  

  本系列文章將從實例出發,以實例結尾。由淺入深講解在我們項目中如何使用WCF和WF。我們會發現使用WCF+WF將造就出其他技術無法達到的高度。最后我會將程序架到云端。

  微軟.net的3W(WPF、WCF、WF)戰略如下圖。WCF負責通信,WPF負責界面展示,WF負責處理業務邏輯,如下圖。

untitled
  本系列文章會主要用到上圖中的所有技術,但是主要講述如何使用WCF和WF來實現系統的中間層。看過亮劍的朋友知道李云龍常打勝仗,并不是他懂得很多很多的戰爭的理論知識,而是來自實戰中的經驗。所以本系列的文章以實戰為核心,在實戰中出理論,不循規蹈矩,我將把自己的實力拿出來,亮出自己的寶劍。

  本系列文章除了WCF和WF兩種主要的技術,還會用到很多其他的技術,WCF和WF兩種技術將一用到底,也會牽扯到其它的技術如WPF、Asp.net MVC、Asp.net Web Form,NH、EF以及一些常用的技巧。我將在實戰中進行演練和對比,在實戰中發現最適合的技術。
  好了,牛皮吹完了,進入今天的正題。本文是這個系列的第一篇文章,我想了想還是從一個簡單的Demo開始。通過這個實例來說明在項目中如何使用WCF和WF。WCF是如何進行數據傳遞的,WF是如何處理業務邏輯的。而實例的業務場景是非常常見的入庫單:錄入入庫材料,更新庫存數量。

  系統架構

  首先,我將說說這個系統架構。可以分為4層。
  第一層:數據持久層:這個例子中我用EF實現的。
  第二層:業務邏輯層:很明顯,這一層我要使用WF實現。
  第三層:服務層:很明顯,這一層我要使用WCF實現。
  第四層:界面層:這里我使用Asp.net MVC。后續文章中,我將會陸續使用MVC、WebForm、WPF、SL四種界面進行展示。
  架構圖如下:

architecture

  數據庫結構圖:只有兩種表。EnterStock表示入庫記錄表,Stock表示庫存表。

db

  數據持久層設計:前面提到了,我使用了EF4實現數據庫的訪問。EF的基本使用大家可以到網上查閱,這里我主要講一下值得講解的東西。由于使用EF生成Model,那么如何在MVC中進行DataAnnotation驗證。看下面代碼設計就明白了。以庫存表為例:

public partial class StockAutoMetadata
{
        
    [DisplayName("Material ID")]
    [Required]
    public System.Guid MaterialID { get; set; }
        
    [DisplayName("Material Name")]
    [Required]
    [StringLength(50)]
    public string MaterialName { get; set; }
        
    [DisplayName("Quantity")]
    [Required]
    public int Quantity { get; set; }
}
[MetadataType(typeof(StockAutoMetadata))]
public partial class Stock
{
}
//在partial類中注入元數據屬性。

  業務邏輯層設計: 用WF處理業務邏輯層是本系列文章的重點。我以入庫操作為例。

  1、增加材料的功能函數設計

public sealed class InsertEnterStock : CodeActivity
{
    public InArgument<EnterStock> Stock { get; set; }

    protected override void Execute(CodeActivityContext context)
    {
        InvoicingEntities entity = new InvoicingEntities();
        entity.AddToEnterStock(Stock.Get(context));
        entity.SaveChanges();
    }
}

  2、更新庫存的功能函數設計

public sealed class UpdateStock : CodeActivity
{
    public InArgument<EnterStock> EnterStock { get; set; }

    protected override void Execute(CodeActivityContext context)
    {
        InvoicingEntities entity = new InvoicingEntities();
        var res = (from r in entity.Stock.ToList() where r.MaterialID == EnterStock.Get(context).MaterialNO select r).FirstOrDefault();
        res.Quantity = res.Quantity + EnterStock.Get(context).Quantity;
        entity.ApplyCurrentValues(res.EntityKey.EntitySetName, res);
        entity.SaveChanges();
    }
}

  3、入庫操作的業務函數設計

  分析:這里我將業務邏輯處理分成了兩種形式。

  1、功能函數:任務單一、簡單;以代碼的方式展現。

  2、業務函數:業務復雜,有功能函數組合而成;以圖形化的方式展現。

  這樣設計,我業務邏輯處理就非常清晰了。

  服務層設計:在WCF中我要做的只是啟動這些業務流程。

  契約:

[ServiceContract]
public interface IInvoicingService
{

    [OperationContract]
    string EnterStock(EnterStock stock);

    [OperationContract]
    IEnumerable<Stock> GetStockList();

    [OperationContract]
    IEnumerable<EnterStock> GetEnterStockList();
    
}

  實現:

public class InvoicingService : IInvoicingService
{

    public string EnterStock(EnterStock stock)
    {
        var p = new Dictionary<string, object> ();
        p.Add("argEnterStock", stock);
        WorkflowInvoker.Invoke(new EnterStockBusiness(), p);
        return "ok";

    }


    public IEnumerable<Stock> GetStockList()
    {
       IDictionary<string, object> outArgument = WorkflowInvoker.Invoke(new GetStockList());
       return outArgument["StockList"] as List<Stock>;
    }


    public IEnumerable<EnterStock> GetEnterStockList()
    {
        IDictionary<string, object> outArgument = WorkflowInvoker.Invoke(new  GetEnterStockList());
        return outArgument["EnterStockList"] as List<EnterStock>;
    }
}

  在服務層中,我沒有任何的業務邏輯判斷和處理,我完全封裝到業務邏輯層了。

  界面層:界面層你可以使用如何你熟悉的技術去實現。這里我使用了Asp.net MVC。具體的實現我不細說了,就讓我演示一下這個簡單的Demo。

  1、簡單的主頁

1

  2、 庫存中兩種材料的庫存數量都是:

2

  3、添加材料

3

  4、庫存數量被更新

4

  5、入庫記錄列表

5

  總結:本文是WCF+WF雙劍合璧系列的第一篇文章,帶領大家實現了一個簡單的Demo。這個Demo還是原型,存在很多不足。希望大家能提出你寶貴的建議,幫助我寫好這個系列的文章。下篇文章中將會談談系統如何實現錯誤處理機制。

  代碼:http://files.cnblogs.com/zhuqil/Invoicing.rar

0
0
 
標簽:WCF WF SOA
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()