博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DotNET企业架构应用实践-实例架构设计中的业务分层-提取独立的业务层
阅读量:6626 次
发布时间:2019-06-25

本文共 4207 字,大约阅读时间需要 14 分钟。

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

 

系列回顾

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

 

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

关于业务层

         业务层是实现应用业务逻辑处理的业务逻辑层(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

      有关本例子所涉及的数据表结构请参考一文,有关数据对象模型定义文件、文档、DDL脚本请下载:,本文代码下载:。

 

链接

QQ群:116773358

 

作者: 
出处:关于作者:有13年的软件从业经历,专注于中小软件企业软件开发过程研究,通过在技术与管理帮助中小软件企业实现技术层面开源节流的目的。熟悉需求分析、企业架构、项目管理。现主要从事基于平台的技术咨询工作,主要服务于医疗卫生、铁路、电信、物流、物联网、制造、零售等行业。如有问题或建议,请多多赐教! 
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,如有问题,可以通过 联系我,也可以加入QQ群:113723486、199463175、116773358、116773358、212867943、147168308、59827496、193486983、15118502和大家共同讨论,非常感谢。

    本文转自魏琼东博客园博客,原文链接:http://www.cnblogs.com/eastjade/archive/2010/10/09/1845050.html,如需转载请自行联系原作者

你可能感兴趣的文章
Oracle to_char转数字小结
查看>>
MariaDB(mysql)之主从同步
查看>>
企业Windows域环境中的组策略应用案例二
查看>>
ASP.NET Aries 入门开发教程6:列表数据表格的格式化处理及行内编辑
查看>>
51CTO首届卡拉OK大赛:我唱,为欢聚而歌
查看>>
LVM逻辑卷管理详解
查看>>
如何实现 Service 伸缩?- 每天5分钟玩转 Docker 容器技术(97)
查看>>
java socket编程
查看>>
MySQL基础建设之硬盘篇
查看>>
Java格式化时间
查看>>
安装Hyper-V
查看>>
配置XenDesktop一例报错-序列不包含任何元素
查看>>
数组循环移位
查看>>
一个优秀的公众号运营者需要具备哪些能力?
查看>>
桌面云
查看>>
教大家如何在word 2007中同时打出对齐上下标以及字母头上有波浪线(非编辑器)...
查看>>
Spring Boot五:使用properties配置文件实现多环境配置
查看>>
vim取消高亮显示
查看>>
设计从“心“开始
查看>>
windows7 系统盘 瘦身软件介绍: 冗余文件清理工具
查看>>