ABP简介领域驱动设计DDD基本概念分层领域驱动设计过程基本术语参考资料基本概念•领域驱动设计不是架构方法,也并非设计模式,而是一种思维方式•传统方式:针对数据进行建模•领域驱动:将需要解决的业务概念和业务规则,通过合理运用面向对象的一些基本要素,转换为软件系统中的类型以及类型的属性与行为。DDD中解决这一问题的核心方法是通用语言。普通的三层领域驱动的分层用户展现层:负责向用户展现信息以及解释用户命令应用层:很薄的一层,用来协调应用的活动,它不包含业务逻辑,它不保留业务对象的状态,但是它保有应用任务的进度状态领域层:本层包含关于领域的信息,这是业务软件的核心所在。这里保留业务对象的状态,对业务对象和他们状态的持久化委托给了基础设施层基础设施层:本层作为其他层的支撑库存在。它提供了层间的通讯,实现对业务对象的持久化,包含对用户界面层的支撑库领域驱动设计过程•领域驱动设计不是架构方法,也并非设计模式,而是一种思维方式。贯穿了整个软件开发的生命周期,包括对需求的分析,建模,架构,设计,甚至最终的编码实现,乃至对编码的测试与重构。•领域驱动设计从业务需求中提炼出统一语言(Ubiquitouslanguage),再基于统一语言建立领域模型,这个领域模型会指导这程序设计以及编码实现,最后,通过重构来发现隐式概念,并运用设计模式改进设计与开发质量。基本术语•通用语言:通用语言包含术语和用例场景,且能够直接反映在代码中•领域•领域模型:形似UML类图•统一建模语言:UML•实体(entity)•值对象(valueobject)•聚合及聚合根(aggregate、aggregateroot)•工厂(factories)•仓储(Repository)实体(entity)•与面向对象中的概念类似,领域模型的基本元素实体(entity)•与面向对象中的概念类似,领域模型的基本元素领域•一个领域本质上可以理解为就是一个问题域,只要是同一个领域,那问题域就相同。所以,只要我们确定了系统所属的领域,那这个系统的核心业务,即要解决的关键问题、问题的范围边界就基本确定了。比如MIS系统1.商品子域2.用户子域3.销售子域4.订单子域5.支付子域6.物流子域值对象(valueobject)•和我们说的编程中数值类型的变量是不同的,它仅仅是没有唯一标识符的实体,比如有两个收获地址的信息完全一样,那它就是值对象,并不是实体。值对象在领域模型中是可以被共享的,他们应该是“不可变的”(只读的),当有其他地方需要用到值对象时,可以将它的副本作为参数传递。聚合及聚合根(aggregate、aggregateroot)•聚合被看作是多个模型单元间的组合,它定义了模型的关系和边界。每个聚合都有一个根,根是一个实体,并且是唯一可被外访问的。•customer是该聚合的根,其他的都是内部对象工厂(factories)•和设计模式中的工厂模式一个意思,把创建对象的细节封装起来,实现了依赖反转仓储(Repository)•仓库封装了获取对象的逻辑,领域对象无须和底层数据库交互,它只需要从仓库中获取对象即可。参考资料•DDD理论学习系列ASP.NETBoilerplateProjectABPABP•ASP.NETBoilerplate是一个用最佳实践和流行技术开发现代WEB应用程序的新起点,它旨在成为一个通用的WEB应用程序框架和项目模板。•ASP.NETBoilerplate基于DDD的经典分层架构思想,实现了众多DDD的概念(但没有实现所有DDD的概念)。服务器端技术•ASP.NETMVC5、ASP.NETCore、WebAPI2、C#5.0•DDD领域驱动设计(Entities、Repositories、DomainServices、DomainEvents、ApplicationServices、DTOs等)•Castlewindsor(依赖注入容器)•EntityFramework6\NHibernate\Dapper,数据迁移•Log4Net(日志记录)•AutoMapper(实现Dto类与实体类的双向自动转换)客户端技术•Bootstrap•Less•Angular,Vue•jQuery•Modernizr•其他JS库:jQuery.validate、jQuery.form、jQuery.blockUI、json2ABP框架已实现了以下特性•多语言/本地化支持•多租户支持(每个租户的数据自动隔离,业务模块开发者不需要在保存和查询数据时写相应代码)•软删除支持(继承相应的基类或实现相应接口,会自动实现软删除)•统一的异常处理(应用层几乎不需要处理自己写异常处理代码)•数据有效性验证(Asp.NETMVC只能做到Action方法的参数验证,ABP实现了Application层方法的参数有效性验证)•日志记录(自动记录程序异常)•模块化开发(每个模块有独立的EFDbContext,可单独指定数据库)•Repository仓储模式(已实现了EntityFramework、NHibernate、MangoDB、内存数据库)•UnitOfWork工作单元模式(为应用层和仓储层的方法自动实现数据库事务)•EventBus实现领域事件(DomainEvents)•DLL嵌入资源管理•通过ApplicationServices自动创建WebApi层(不需要写ApiController层了)•自动创建Javascript的代理层来更方便使用WebApi•封装一些Javascript函数,更方便地使用ajax、消息框、通知组件、忙状态的遮罩层等等项目说明各层概念:1.表现层(PresentationLayer):图中的用户界面层包括用户接口层,用户输入和数据展示。2.应用层(ApplicationLayer):应用层定义系统的业务功能,并指挥领域层中的领域对象实现这些功能。3.领域层(DomainLayer):核心层,实现所有业务逻辑。4.基础设施层(InfrastructureLayer):提供整个业务系统的基础服务。谢谢观看