|
本系列文章將從實(shí)例出發(fā),以實(shí)例結(jié)尾。由淺入深講解在我們項(xiàng)目中如何使用WCF和WF。我們會(huì)發(fā)現(xiàn)使用WCF+WF將造就出其他技術(shù)無法達(dá)到的高度。最后我會(huì)將程序架到云端。
微軟.NET的3W(WPF、WCF、WF)戰(zhàn)略如下圖。WCF負(fù)責(zé)通信,WPF負(fù)責(zé)界面展示,WF負(fù)責(zé)處理業(yè)務(wù)邏輯,如下圖。
本系列文章會(huì)主要用到上圖中的所有技術(shù),但是主要講述如何使用WCF和WF來實(shí)現(xiàn)系統(tǒng)的中間層。看過亮劍的朋友知道李云龍常打勝仗,并不是他懂得很多很多的戰(zhàn)爭(zhēng)的理論知識(shí),而是來自實(shí)戰(zhàn)中的經(jīng)驗(yàn)。所以本系列的文章以實(shí)戰(zhàn)為核心,在實(shí)戰(zhàn)中出理論,不循規(guī)蹈矩,我將把自己的實(shí)力拿出來,亮出自己的寶劍。
本系列文章除了WCF和WF兩種主要的技術(shù),還會(huì)用到很多其他的技術(shù),WCF和WF兩種技術(shù)將一用到底,也會(huì)牽扯到其它的技術(shù)如WPF、ASP.NET MVC、ASP.NET Web Form,NH、EF以及一些常用的技巧。我將在實(shí)戰(zhàn)中進(jìn)行演練和對(duì)比,在實(shí)戰(zhàn)中發(fā)現(xiàn)最適合的技術(shù)。
好了,牛皮吹完了,進(jìn)入今天的正題。本文是這個(gè)系列的第一篇文章,我想了想還是從一個(gè)簡(jiǎn)單的Demo開始。通過這個(gè)實(shí)例來說明在項(xiàng)目中如何使用WCF和WF。WCF是如何進(jìn)行數(shù)據(jù)傳遞的,WF是如何處理業(yè)務(wù)邏輯的。而實(shí)例的業(yè)務(wù)場(chǎng)景是非常常見的入庫單:錄入入庫材料,更新庫存數(shù)量。
系統(tǒng)架構(gòu)
首先,我將說說這個(gè)系統(tǒng)架構(gòu)。可以分為4層。
第一層:數(shù)據(jù)持久層:這個(gè)例子中我用EF實(shí)現(xiàn)的。
第二層:業(yè)務(wù)邏輯層:很明顯,這一層我要使用WF實(shí)現(xiàn)。
第三層:服務(wù)層:很明顯,這一層我要使用WCF實(shí)現(xiàn)。
第四層:界面層:這里我使用ASP.NET MVC。后續(xù)文章中,我將會(huì)陸續(xù)使用MVC、WebForm、WPF、SL四種界面進(jìn)行展示。
架構(gòu)圖如下:
數(shù)據(jù)庫結(jié)構(gòu)圖:只有兩種表。EnterStock表示入庫記錄表,Stock表示庫存表。
數(shù)據(jù)持久層設(shè)計(jì):前面提到了,我使用了EF4實(shí)現(xiàn)數(shù)據(jù)庫的訪問。EF的基本使用大家可以到網(wǎng)上查閱,這里我主要講一下值得講解的東西。由于使用EF生成Model,那么如何在MVC中進(jìn)行DataAnnotation驗(yàn)證。看下面代碼設(shè)計(jì)就明白了。以庫存表為例:
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類中注入元數(shù)據(jù)屬性。
業(yè)務(wù)邏輯層設(shè)計(jì):用WF處理業(yè)務(wù)邏輯層是本系列文章的重點(diǎn)。我以入庫操作為例。
1、增加材料的功能函數(shù)設(shè)計(jì)
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、更新庫存的功能函數(shù)設(shè)計(jì)
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、入庫操作的業(yè)務(wù)函數(shù)設(shè)計(jì)
分析:這里我將業(yè)務(wù)邏輯處理分成了兩種形式。
1、功能函數(shù):任務(wù)單一、簡(jiǎn)單;以代碼的方式展現(xiàn)。
2、業(yè)務(wù)函數(shù):業(yè)務(wù)復(fù)雜,有功能函數(shù)組合而成;以圖形化的方式展現(xiàn)。
這樣設(shè)計(jì),我業(yè)務(wù)邏輯處理就非常清晰了。
服務(wù)層設(shè)計(jì):在WCF中我要做的只是啟動(dòng)這些業(yè)務(wù)流程。
契約:
[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>;
}
}
在服務(wù)層中,我沒有任何的業(yè)務(wù)邏輯判斷和處理,我完全封裝到業(yè)務(wù)邏輯層了。
界面層:界面層你可以使用如何你熟悉的技術(shù)去實(shí)現(xiàn)。這里我使用了ASP.NET MVC。具體的實(shí)現(xiàn)我不細(xì)說了,就讓我演示一下這個(gè)簡(jiǎn)單的Demo。
1、簡(jiǎn)單的主頁
2、 庫存中兩種材料的庫存數(shù)量都是:
3、添加材料
4、庫存數(shù)量被更新
5、入庫記錄列表
總結(jié):本文是WCF+WF雙劍合璧系列的第一篇文章,帶領(lǐng)大家實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的Demo。這個(gè)Demo還是原型,存在很多不足。希望大家能提出你寶貴的建議,幫助我寫好這個(gè)系列的文章。下篇文章中將會(huì)談?wù)勏到y(tǒng)如何實(shí)現(xiàn)錯(cuò)誤處理機(jī)制。
代碼:http://files.cnblogs.com/zhuqil/Invoicing.rar
NET技術(shù):WCF+WF雙劍合璧構(gòu)建微軟的SOA系列(一):從一個(gè)簡(jiǎn)單的Demo開始,轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。