zoukankan      html  css  js  c++  java
  • 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[0as 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脚本请下载:https://files.cnblogs.com/eastjade/demo.db.doc.sql.rar,本文代码下载:BL.Demo1.rar

    链接

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

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

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

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

    AgileEAS.NET官方网站

    敏捷软件工程实验室

    QQ群:116773358

  • 相关阅读:
    POJ 2342.Anniversary party-树形dp
    Codeforces Round #363 (Div. 2) A、B、C
    Codeforces Beta Round #17 D.Notepad 指数循环节
    hdu 5920 Wool 思路
    hdu 5719 Arrange 贪心
    hdu 5718 Oracle 高精度
    hiho #1332 : 简单计算器 栈+递归
    UESTC 1074 秋实大哥搞算数 栈模拟
    cdoj 1329 卿学姐与魔法 优先队列
    cdoj 1324 卿学姐与公主 线段树裸题
  • 原文地址:https://www.cnblogs.com/eastjade/p/1845050.html
Copyright © 2011-2022 走看看