天天看點

DotNET企業架構應用實踐-執行個體架構設計中的業務分層-提取獨立的業務層

系列回顧

DotNET企業架構應用實踐-執行個體架構設計中的業務分層-提取獨立的業務層
DotNET企業架構應用實踐-執行個體架構設計中的業務分層-提取獨立的業務層

<a href="http://www.cnblogs.com/eastjade/admin/file:///C:/Users/james/AppData/Local/Temp/WindowsLiveWriter-429641856/supfilesBC6866/image10.png"></a>

         業務層是實作應用業務邏輯處理的業務邏輯層(Business Logic Layer,我們簡稱為BLL或者BL,從系統架構的理論角度講,業務邏輯處理存在于任何架構的系統,我們把這些處理業務邏輯的代碼獨立抽取出來則形成獨立業務層。

         那麼,業務層到底是做什麼呢,在基于資料庫支援的管理資訊系統中,其大多采用的是UI--&gt;BL--&gt;DAL這樣的基準分層架構或者基于這種基準架構的擴充,如UI--&gt;BL-Agent—&gt;BL-&gt;DAL或者UI--&gt;BL-Agent-&gt;SL-Agent—&gt;SL—&gt;BL-&gt;DAL等等結構。

         在于UI--&gt;BL--&gt;DAL這種分層結構的系統之中,業務層使用DAL層提供的資料通路服務封裝業務邏輯以供UI層使用,也就是可以簡單的了解為,業務層把UI要求的業務處理進行轉化并使用DAL層提供的服務按業務流程進行處理。

<a href="http://www.cnblogs.com/eastjade/admin/file:///C:/Users/james/AppData/Local/Temp/WindowsLiveWriter-429641856/supfilesBC6866/image5.png"></a>

DotNET企業架構應用實踐-執行個體架構設計中的業務分層-提取獨立的業務層

         現在我們回家看我們前面示範的例子,我們的例子中隻分解了UI(ClassLib.OrmDemo)和DAL層(ClassLibDemo.DAL.Interface、ClassLibDemo.DAL.SQLServer),那麼是不是我們沒有業務邏輯呢,這倒不是,隻不過,業務邏輯被分解到DAL和UI層之中了,因為在DAL層中的資料對象之中已經預設提供了資料業務處理的CRUD,也算是一種業務處理,複雜一些的業務,如産品入庫處理這樣的業務我們則由程式員自己編寫,并且增加在生成的DAL代碼之中的分部類之中。

         當然對于一個很簡單的應用,我們這樣處理是一種選擇,如果這個應用很複雜,我們采用這種結構則會顯得代碼結構有點混亂,我們有必要提出獨立的業務邏輯層(BL)。

         現在我們需要在原有解雇方案之中增加一個項目ClassLibDemo.BL,則項目結構變成如下:

<a href="http://www.cnblogs.com/eastjade/admin/file:///C:/Users/james/AppData/Local/Temp/WindowsLiveWriter-429641856/supfilesBC6866/image19.png"></a>

DotNET企業架構應用實踐-執行個體架構設計中的業務分層-提取獨立的業務層

         在ClassLib.OrmDemo和ClassLibDemo.DAL.Interface之中增加一個項目ClassLibDemo.BL,其職責是完成除ORM對象CRUD之外的業務,從上圖我們也可以看出ClassLib.OrmDemo也有跨過ClassLibDemo.BL對ClassLibDemo.DAL.Interface的直接調用。

         關于此問題有一個争論,那就是ORM對象應該是獨立的存儲對象還是具有一定的業務功能,如,Insert、Update、Delete,我們估且不讨論這個,在目前的AgileEAS.NET平台中,ORM對象含有這些業務邏輯功能。

         基于以上原因,在基于AgileEAS.NET平台的應用開發中,業務層的職責是處理除ORM對象CRUD之外的業務,也就是複雜的業務邏輯。

         現在我就商品入庫業務示範一下業務的變更,首先我們注釋或者删除ClassLibDemo.DAL.Interface項目中接口IProductInList的方法ProductIn定義,同時删除ClassLibDemo.DAL.SQLServer中相關的代碼,在ClassLibDemo.BL中增加一個類ProductInBL,代碼如下:

 1     public class ProductInBL:EAS.Business.BusinessObject

 2     {

 3         /// &lt;summary&gt;

 4         /// 産品入庫業務。

 5         /// &lt;/summary&gt;

 6         /// &lt;param name="pInList"&gt;&lt;/param&gt;

 7         public void ProductIn(IProductInList pInList)

 8         {

 9             this.DataAccessor.TransactionExecute(new TransactionHandler2(this.InternalIn), pInList);

10         }

11 

12         void InternalIn(IDataAccessor accessor, params object[] parameters)

13         {

14             IProductStore pStore = DALHelper.DALManager.CreateProductStore();

15             pStore.DataAccessor = accessor;

16 

17             IProductInList pInList = parameters[0] as IProductInList; //通過參數取值。

18 

19             foreach (IProductIn pIn in pInList.Rows)

20             {

21                 pIn.DataAccessor = accessor;

22                 pIn.Idn = pIn.GetMaxNewIdn();

23                 pIn.Insert();

24 

25                 pStore.Code = pIn.Code;

26                 pStore.Price = pIn.Price;

27                 pStore.Refresh();

28 

29                 if (pStore.Exists)

30                 {

31                     pStore.Number += pIn.Number;

32                     pStore.Update();

33                 }

34                 else

35                 {

36                     pStore.Idn = pStore.GetMaxNewIdn();

37                     pStore.Code = pIn.Code;

38                     pStore.Name = pIn.Name;

39                     pStore.Spec = pIn.Spec;

40                     pStore.Unit = pIn.Unit;

41                     pStore.Price = pIn.Price;

42                     pStore.Number = pIn.Number;

43                     pStore.Insert();

44                 }

45             }

46         }

47     }

         我們修改UI項目中入庫業務調用的代碼ProductInDemo如下: 

 1     class ProductInDemo

 3         public void ProductIn1()

 4         {

 5             this.ProductIn2();

 6         }

 7 

 8         public void ProductIn2()

 9         {

10             IProductInList pInList =DALHelper.DALManager.CreateProductInList();

12             IProduct dict =DALHelper.DALManager.CreateProduct();

13             dict.Code = "1AZ0002094";

14             dict.Refresh();

15 

16             IProductIn pIn =DALHelper.DALManager.CreateProductIn();

17             pIn.Code = dict.Code;

18             pIn.Name = dict.Name;

19             pIn.Spec = dict.Spec;

20             pIn.Unit = dict.Unit;

21             pIn.Price = 12.8M;

22             pIn.Number = 200;

23 

24             pIn.InTime = DateTime.Now;

25             pIn.BillCode = DateTime.Now.ToString("yyyyMMddHHmmss") + "_1";

26             pIn.Operator = "james-orm";

27             pInList.Rows.Add(pIn);

29             try

30             {

31                 new ProductInBL().ProductIn(pInList);

32                 System.Console.WriteLine("入庫處理完成。");

33             }

34             catch

35             {

36                 System.Console.WriteLine("入庫未完成。");

37             }

38         }

39     }

最後編譯運作:

<a href="http://images.cnblogs.com/cnblogs_com/eastjade/WindowsLiveWriter/AgileEAS.NET_10AF4/image_19.png"></a>

DotNET企業架構應用實踐-執行個體架構設計中的業務分層-提取獨立的業務層

連結

<a href="http://www.cnblogs.com/eastjade/archive/2010/09/19/1830812.html">一步一步教你使用AgileEAS.NET基礎類庫進行應用開發-系列目錄</a>

<a href="http://www.cnblogs.com/eastjade/archive/2010/09/12/1824405.html">AgileEAS.NET平台開發指南-系列目錄</a>

<a href="http://www.cnblogs.com/eastjade/archive/2010/09/09/1822530.html">AgileEAS.NET應用開發平台介紹-文章索引</a>

<a href="http://www.cnblogs.com/eastjade/archive/2010/09/15/1826870.html">AgileEAS.NET平台應用開發教程-案例計劃</a>

<a href="http://www.smarteas.net/">AgileEAS.NET官方網站</a>

<a href="http://www.agilelab.cn/">靈活軟體工程實驗室</a>

QQ群:116773358