DotNET企业架构应用实践-实例架构设计中的业务分层-提取独立的业务层

      说明一下,原本的思路是通过一步一步教你使用AgileEAS.NET基础类库进行应用开发-系列目录相关的文章来逐步讲解基于AgileEAS.NET平台进行应用开发的文章,但是在进行案例讲解的过程,我们不得不扯到有关于AgileEAS.NET平台进行应用开发的架构设计方面的东西,我就把一些与架构有关的文章分离出来讲,了,我是基于AgileEAS.NET平台的应用开发实例来讲解架构设计,所以本文应该还有个副标题“一步一步教你使用AgileEAS.NET基础类库进行应用开发-基础篇-提取独立的业务层”,如果可能的话我会在这些独立抽取出来的文章的基础上,来个实例讲解DotNET企业架构应用实践方面的系列。

 

系列回顾

         在前面的文章中,我从统一数据访问开始讲起,通过UDA到ORM的一步一步的深入,我们讲到了应用系统开发架构之中的数据访问层,并且详细的讲解了基于接口驱动的数据层,一步一步教你使用AgileEAS.NET基础类库进行应用开发-基础篇-基于接口驱动的数据层一文中我提到了以下的分层模型:

 

          但是在严格意义上讲,我们之前一直在讲数据访问层的东西,演示的例子中并完成拥有独立的业务逻辑层,整体结构如下:

关于业务层

         业务层是实现应用业务逻辑处理的业务逻辑层(Business Logic Layer,我们简称为BLL或者BL,从系统架构的理论角度讲,业务逻辑处理存在于任何架构的系统,我们把这些处理业务逻辑的代码独立抽取出来则形成独立业务层。

         那么,业务层到底是做什么呢,在基于数据库支持的管理信息系统中,其大多采用的是UI-->BL-->DAL这样的基准分层架构或者基于这种基准架构的扩展,如UI-->BL-Agent—>BL->DAL或者UI-->BL-Agent->SL-Agent—>SL—>BL->DAL等等结构。

         在于UI-->BL-->DAL这种分层结构的系统之中,业务层使用DAL层提供的数据访问服务封装业务逻辑以供UI层使用,也就是可以简单的理解为,业务层把UI要求的业务处理进行转化并使用DAL层提供的服务按业务流程进行处理。

 

 

现在的问题

         现在我们回家看我们前面演示的例子,我们的例子中只分解了UI(ClassLib.OrmDemo)和DAL层(ClassLibDemo.DAL.Interface、ClassLibDemo.DAL.SQLServer),那么是不是我们没有业务逻辑呢,这倒不是,只不过,业务逻辑被分解到DAL和UI层之中了,因为在DAL层中的数据对象之中已经默认提供了数据业务处理的CRUD,也算是一种业务处理,复杂一些的业务,如产品入库处理这样的业务我们则由程序员自己编写,并且增加在生成的DAL代码之中的分部类之中。

         当然对于一个很简单的应用,我们这样处理是一种选择,如果这个应用很复杂,我们采用这种结构则会显得代码结构有点混乱,我们有必要提出独立的业务逻辑层(BL)。

结构的变化

         现在我们需要在原有解雇方案之中增加一个项目ClassLibDemo.BL,则项目结构变成如下:

 

 

 

         在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           ///   <summary>
 4           ///  产品入库业务。
 5           ///   </summary>
 6           ///   <param name="pInList"></param>
 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
 2      {
 3           public   void  ProductIn1()
 4          {
 5               this .ProductIn2();
 6          }
 7 
 8           public   void  ProductIn2()
 9          {
10              IProductInList pInList  = DALHelper.DALManager.CreateProductInList();
11 
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);
28 
29               try
30              {
31                   new  ProductInBL().ProductIn(pInList);
32                  System.Console.WriteLine( " 入库处理完成。 " );
33              }
34               catch
35              {
36                  System.Console.WriteLine( " 入库未完成。 " );
37              }
38          }
39      }

 

最后编译运行:

image

      有关本例子所涉及的数据表结构请参考基于AgileEAS.NET平台基础类库进行应用开发-总体说明及数据定义一文,有关数据对象模型定义文件、文档、DDL脚本请下载:http://files.cnblogs.com/eastjade/demo.db.doc.sql.rar,本文代码下载:BL.Demo1.rar

 

链接

一步一步教你使用AgileEAS.NET基础类库进行应用开发-系列目录

AgileEAS.NET平台开发指南-系列目录

AgileEAS.NET应用开发平台介绍-文章索引

AgileEAS.NET平台应用开发教程-案例计划

AgileEAS.NET官方网站

敏捷软件工程实验室

QQ群:116773358

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值