走向.NET架构设计—第四章—业务层分层架构(前篇)

简介:


走向.NET架构设计第四章业务层分层架构(前篇)

  前言:在任何一个项目中业务层毫无疑问是最重要的层,所以在设计的过程中,如何组织业务层是至关重要的。本章的讨论将会涉及Flower 的架构模式一书中的四种组织业务层的模式:Transaction Sript,Active Record,Anemic Model  Domain Model 。每一中组织业务逻辑的模式有着各自都优缺点,如何选择他们重要的还是取决于我们所要开发的项目的类型。
      在讨论完四种模式之后,我将会和大家一起来看看DDD 的一些知识。
      每种模式的讲解,我都会用实例的形式给出完整的代码,也希望大家多琢磨!
 
本篇议题如下:
Transaction Scrip( 前篇)
Active Record 前篇)
Domain Model (中篇)
Anemic Model (中篇)
DDD (后篇)
 
 
  不是所有的应用程序都是一样的,也不是所有的系统都需要用复杂的架构来组织业务逻辑。作为开发人员,我们必须清楚每一种业务逻辑组织的模式,这样我们才能在需要的时候做出合适的选择。
 
  Transaction Script
这种组织业务逻辑的模式是最简单,也是最容易理解的。Transaction Script 模式就是用面向过程的方式来组织业务逻辑的。通常情况下,系统的一个流程就被实现为一个方法,然后把所有的这些方法组织在一起,放在一个静态的manager 类或者service  类中。实现流程的那个方法包含了业务逻辑的Check Validation ,数据的持久化以及其他的一些相关操作。也就是说,一个方法把所有的事情都做完了。当然,有时候这个大的方法还可能被拆成小的方法,便于重用。
 
Transaction Script 一个好处就是理解起来很简单,尤其是当Team 中的一个新成员来说,更是如此,因为他几乎不用花什么时间,就能立刻明白这种组织业务逻辑的方式。每当来了一个新的需求的时候,要做的事情就是去加上一个或者一些新的方法来是实现这个需求,而其还不会影响其他已经存在的功能。
 
对于一个很小的或者基本山没什么业务逻辑的系统来说,用Transaction Script 模式组织业务逻辑还是很不错的,而且对一个刚刚踏入IT 的开发人员门槛也比较低。:当系统开始变大,业务逻辑开始变得复杂的时候Transaction Script 的问题的出来了。最后的结果可能就是系统中存在大量的方法,而且这些方法中到处都是重复的代码。有的时候,我们可以提炼出一些业务逻辑的验证代码组织为方法,但是我们去很难提炼出一些在流程上相识的代码,即使两个流程只有一点点的不同。如果系统的需求稍微一边,导致流程变了一点点,那么很多的方法就要改动,而且我们还得在系统中去找出那些相似的流程代码,然后修改,万一哪个方法没有找出,后果可想而知。
 
下面我们就用一个人事请假管理系统为例子来看看Transaction Script 是如何实现的。因为Transaction Script 很简单,所以下面的代码也只是用于演示,大家理解就行了。
 
代码
public   class  HolidayService
{
      
public   static   bool  BookHolidayFor( int  employeeId, DateTime From, DateTime To)
      {
          
bool  booked  =   false ;
          TimeSpan numberOfDaysRequestedForHoliday 
=  To  -  From;
          
if  (numberOfDaysRequestedForHoliday.Days  >   0 )
            {
              
if  (RequestHolidayDoesNotClashWithExistingHoliday(employeeId, From, To))
                {
                    
int  holidayAvailable  =  GetHolidayRemainingFor(employeeId);
                    
if  (holidayAvailable  >=  numberOfDaysRequestedForHoliday.Days)
                    {
                        SubmitHolidayBookingFor(employeeId, From, To);
                        booked 
=   true ;
                    }
                }
            }
            
return  booked;
        }

        
private   static   int  GetHolidayRemainingFor( int  employeeId)
        {
            
//  ...
        }

        
public   static  List < EmployeeDTO >  GetAllEmployeesOnLeaveBetween(
        DateTime From, DateTime To)
        {
            
//  ...
        }

        
public   static  List < EmployeeDTO >  GetAllEmployeesWithHolidayRemaining()
        {
            
//  ...
        }
    }
 
 
          一眼看上去,我们就很容易理解这种面向过程的方式:系统中的所有的用例都被组织成了一个个的方法。例如在BookHolidayFor 方法中就做了很多的事情:查询和持久化数据,是否允许请教的业务逻辑的实现等。
          如果在一个很简单的,业务很少的系统中采用这种方式还是可以的,随着业务逻辑的越来越复杂,我们就得重新考虑下这种组织逻辑的方式,越早发现,越早做出改变,以后的成本将会越小。
 
  Active Record
         下面就以一个内容管理系统中的文章管理功能为例来讲述如何使用活动记录模式来组织业务逻辑。相信大家对内容管理管理系统(CMS)都有一些了解,对于文章模块,用户可以发布文章,游客或其他用户可以发表评论。在相应的数据库中,存在着文章表tb_Articles和评论表tb_Comments
       
   Active Record 模式中,每一个业务对象各自负责自己的数据持久化逻辑和相关的业务逻辑。正如前面提到的: Active Record 模式很适合那种“业务对象和数据表一 一对应”的简单的应用程序,例如 Blog Forum 等系统。因为在 Active Record 模式中,每一个业务类和表都有对应的关系,而且业务类都包含了 CRUD 的操作,那么我们可以使用一些代码生成工具来加速我们的开发,而且有些好的代码生成工具还包含了一些数据库的逻辑验证代码来确保我们把正确的数据保存到数据库中。
 
          下面我们就用一个例子来看看这种模式是如何应用的。例子还是采用之前谈到的CMS  Blog 系统。
      在业务层,业务类ArticleComment的结构如图所示
 
    在Active Record 模式中,每一个业务对象各自负责自己的数据持久化逻辑和相关的业务逻辑
    正如前面提到的:Active Record 模式很适合“业务对象和数据表一一对应”的应用程序,例如Blog Forum 等系统;同时Active Record 模式也比较适合“数据为先”的应用程序:根据现有的数据库来组织逻辑和建立业务模型。
 
     因为在Active Record 模式中,每一个业务类和表都有对应的关系,而且业务类都包含了CRUD 的操作,我们可以使用一些代码生成工具来加速开发,而且有些好的代码生成工具还包含了一些数据库的逻辑验证代码,以确保我们把正确的数据保存到数据库中。例如,在.NET 中,可以直接使用Castle  Active Record Framework 来快速开发应用程序。
     下面就使用 Castle ActiveRecord 框架来开发上面的文章管理模块
 
 [ActiveRecord( " tb_Comments ")]
     public  class Comment : ActiveRecordBase<Comment>
    {
        [PrimaryKey]
         public  int Id {  getset; }

        [BelongsTo( " ArticleID ")]
         public Article Post {  getset; }

        [Property]
         public  string Subject {  getset; }

        [Property]
         public  string Content {  getset; }

        [Property]
         public DateTime CreatedDate {  getset; }

        [Property]
         public  string CreatedBy {  getset; }

        [Property]
         public DateTime UpdatedDate {  getset; }
    }
    上面的代码可以看成类似 ORM 的映射过程:在 Comment 类加上 Attribute ,表明这个属性和数据表中同名的列对应(在 Castle.ActiveRecord 框架内部也采用了 NHibernate ,所以,上面实际上就是 NHibernate 的映射)。         
 
从上面的一些工作量可以看出,用相应的 Frameword 来实现 blog 系统还是比较的快的。而且上面的例子中,业务类和表的结构很一致,这也是 Active Record 的特点和优势。但是如果业务类和数据表的结构不一致,而且逻辑也变复杂了,也就是出现了“抗阻不匹配”。如果还在这中模式上面坚持,会使后面的开始过程和代码维护变得困难,那么我们就得采用 Domain Model 模式来组织业务逻辑。
 
上面的例子讲的很粗糙,因为上面的两种模式本身还是比较容易理解的,到了 Domain Model 模式的讲解的时候,会更加的详细。
 
今天就到这里了,还是希望多多见谅,支持!谢谢啊!
















本文转自yanyangtian51CTO博客,原文链接:
http://blog.51cto.com/yanyangtian/413312
 ,如需转载请自行联系原作者


相关文章
|
3月前
|
人工智能 前端开发 JavaScript
前端架构思考 :专注于多框架的并存可能并不是唯一的方向 — 探讨大模型时代前端的分层式微前端架构
随着前端技术的发展,微前端架构成为应对复杂大型应用的流行方案,允许多个团队使用不同技术栈并将其模块化集成。然而,这种设计在高交互性需求的应用中存在局限,如音视频处理、AI集成等。本文探讨了传统微前端架构的不足,并提出了一种新的分层式微前端架构,通过展示层与业务层的分离及基于功能的横向拆分,以更好地适应现代前端需求。
|
1月前
|
数据库
分层架构
表现层(Presentation Layer):处理用户界面和用户交互逻辑。 业务逻辑层(Business Logic Layer):处理业务相关的逻辑和规则。 数据访问层(Data Access Layer):负责与数据库或其他数据源进行 [Something went wrong, please try again later.]。
|
3月前
|
JSON 前端开发 Java
Spring Boot框架中的响应与分层解耦架构
在Spring Boot框架中,响应与分层解耦架构是两个核心概念,它们共同促进了应用程序的高效性、可维护性和可扩展性。
77 3
|
3月前
|
存储 前端开发 API
DDD领域驱动设计实战-分层架构
DDD分层架构通过明确各层职责及交互规则,有效降低了层间依赖。其基本原则是每层仅与下方层耦合,分为严格和松散两种形式。架构演进包括传统四层架构与改良版四层架构,后者采用依赖反转设计原则优化基础设施层位置。各层职责分明:用户接口层处理显示与请求;应用层负责服务编排与组合;领域层实现业务逻辑;基础层提供技术基础服务。通过合理设计聚合与依赖关系,DDD支持微服务架构灵活演进,提升系统适应性和可维护性。
|
2月前
|
数据管理 Nacos 开发者
"Nacos架构深度解析:一篇文章带你掌握业务层四大核心功能,服务注册、配置管理、元数据与健康检查一网打尽!"
【10月更文挑战第23天】Nacos 是一个用于服务注册发现和配置管理的平台,支持动态服务发现、配置管理、元数据管理和健康检查。其业务层包括服务注册与发现、配置管理、元数据管理和健康检查四大核心功能。通过示例代码展示了如何在业务层中使用Nacos,帮助开发者构建高可用、动态扩展的微服务生态系统。
130 0
|
5月前
|
存储 消息中间件 JSON
|
1月前
|
弹性计算 API 持续交付
后端服务架构的微服务化转型
本文旨在探讨后端服务从单体架构向微服务架构转型的过程,分析微服务架构的优势和面临的挑战。文章首先介绍单体架构的局限性,然后详细阐述微服务架构的核心概念及其在现代软件开发中的应用。通过对比两种架构,指出微服务化转型的必要性和实施策略。最后,讨论了微服务架构实施过程中可能遇到的问题及解决方案。
|
2月前
|
Cloud Native Devops 云计算
云计算的未来:云原生架构与微服务的革命####
【10月更文挑战第21天】 随着企业数字化转型的加速,云原生技术正迅速成为IT行业的新宠。本文深入探讨了云原生架构的核心理念、关键技术如容器化和微服务的优势,以及如何通过这些技术实现高效、灵活且可扩展的现代应用开发。我们将揭示云原生如何重塑软件开发流程,提升业务敏捷性,并探索其对企业IT架构的深远影响。 ####
53 3
|
2月前
|
Cloud Native 安全 数据安全/隐私保护
云原生架构下的微服务治理与挑战####
随着云计算技术的飞速发展,云原生架构以其高效、灵活、可扩展的特性成为现代企业IT架构的首选。本文聚焦于云原生环境下的微服务治理问题,探讨其在促进业务敏捷性的同时所面临的挑战及应对策略。通过分析微服务拆分、服务间通信、故障隔离与恢复等关键环节,本文旨在为读者提供一个关于如何在云原生环境中有效实施微服务治理的全面视角,助力企业在数字化转型的道路上稳健前行。 ####
|
1月前
|
Java 开发者 微服务
从单体到微服务:如何借助 Spring Cloud 实现架构转型
**Spring Cloud** 是一套基于 Spring 框架的**微服务架构解决方案**,它提供了一系列的工具和组件,帮助开发者快速构建分布式系统,尤其是微服务架构。
169 69
从单体到微服务:如何借助 Spring Cloud 实现架构转型