Spiga

2024年4月的文章归档

ABP成长系列3:动态API

2024-04-27 16:12:33

摘要:前面我们介绍了Abp的模块化,号称能随意拆分,随意组装, 能各种复用,是真的超牛。 但是这样就可以了吗?虽然是可以任意组装了,比如A项目被拆分成A、B两个项目了。如何才能做的优雅,做的有意义? ABP的答案是这样的: 最强CP——ADO(Auto API+Dynamic Client+Options) 模块化===能力复用 Auto API Controller:轻松组合到一个进程,也可以模块化独立部署,拆分分布式 Dynamic C# Client:服务之间的调用(跟本地调用一样),都不用改代码,就可以轻松替换成分布式调用 定制化需求:Options选项模式完成定制 一、Auto API Controllers 创建应用程序服务后, 通常需要创建API控制器以将此服务公开为 HTTP(REST)API端点 典型的API控制器除了将方法调用重定向到应用程序服务并使用[HttpGet],[HttpPost],[Route]等属性配置REST API之外什么都不做 瘦控制器:本身是可以不要的 ABP可以按照惯例自动将应用程序服务配置为API控制器 大多数时候不关心它的详细配置,但它可以完全被自定义,而且还可以做好复用 Auto-API-Controllers自动API控制器,可以不用写控制器Action了,就可以直接把应用服务暴露成WebAPI 1. 配置方法 服务标记成IRemoteService 配置AbpAspNetCoreMvcOptions TypePredicate ConventionalControllers.Create 以上就完成了Auto-API-Controller 2. 自定义HttpMethod ABP在确定服务方法的HTTP Method时使用命名约定: Get:如果方法名称以GetList,GetAll或Get开头 Put:如果方法名称以Put或Update开头 Delete:如果方法名称以Delete或Remove开头 Post:如果方法名称以Create,Add,Insert或Post开头 Patch:如果方法名称以Patch开头 其他情况,Post 为 默认方式 自定义HTTP Method,则可以使用标准ASP.NET Core的属性 ([HttpPost], [HttpGet], [HttpPut]..…… 阅读全文

ABP成长系列2:模块化

2024-04-20 12:05:23

摘要:在讲ABP的模块实现前,我们先来认识一下ABP。 一、初识ABP 1. ABP vNext是什么 ASP.NET Core的开源WEB应用程序框架——就是再封装一层,扩展了一系列的封装,完成了很多通用的。 ABP是用于创建现代Web应用程序的完整架构和强大的基础设施! 遵循最佳实践和约定,为你提供SOLID开发经验 https://www.abp.io/ https://github.com/abpframework/abp 2. 架构特点 应用程序模块化 领域驱动设计DDD 微服务架构 支持仓储,基于O/RM实现数据库无关性和MongoDB集成 可扩展及可替换 3. 基础设施 领域驱动设计 模块化设计 多租户 Dependency Injection 认证与授权 事件总线 数据访问 Auto API及动态代理 4. 其他组件 横切面关注 虚拟文件系统 数据过滤 本地化 异常处理 审计日志 二、开启ABP.vNext 1. 使用 ABP CLI 工具直接生成 超多内容,请自行查看。https://docs.abp.io/zh-Hans/abp/latest/CLI 也可以在 https://abp.io 直接生成 可以查看基础项目 BookStore,账号 admin,密码 1q2w3E* 自动化生成一次性生成了太多代码,不适合学习,接下来我们要研究一下手动集成 2. 手动集成控制台项目 手动创建一个.net core控制台项目,添加核心nuget包,Volo.Abp 创建一个HelloWorldService服务,使用瞬时生命周期 [Dependency(ServiceLifetime.Transient)] public class HelloWorldService() { public void Run() { Console.WriteLine(Hello World); } } ABP是模块化的,所以我们要创建一个模块类 AppModule public class AppModule : AbpModule { public override void OnApplicationInitialization(ApplicationInitializationContext …… 阅读全文

ABP成长系列1:DDD

2024-04-13 15:06:58

摘要:最近有一个重写一个电商老系统的需求。这是一个运行了10来年的单体应用,随着业务的越来复杂,这套系统已经很难维护了,性能也越来越差,公司也终于启动了重写计划。 重写肯定是不会再使用单体架构了,具体是用分布式架构,还是微服务来写,其实也就是服务的颗粒度划分的问题。但无论是分布式还是微服务,系统的复杂度会是增加几十甚至上百倍。 在重写之前,我一直在想是完全从零开始搭建框架,还是使用ABP这样提供了基础设施最佳实践的框架。好在公司的业务也不是很复杂,几个人的团队已经可以着手重写的任务了。于是我计划在搭建框架前,先跟团队一直深入学习一遍ABP的底层。 ABP是模块化设计理念可以说是它的精髓,这也是之所以要学习这个框架的原因。我们的计划是使用ABP的基础核心库来打架项目基础创建,这样重写时哪些可以用ABP的基础设施来直接搭建应用,哪些要完全自建底层逻辑,哪些甚至可以套用旧代码简单重构,就会轻松很多。 说了这么多,不管是分布式还是微服务,ABP还是从零开始,首先要做的是对齐设计思想。而这绕不开的就是DDD,我们今天先来总结一下DDD的核心思想。 一、什么是领域驱动设计 1. 传统软件开发 业务梳理 == 软件设计 == 开发 初期-简单-迭代-复杂-冗杂-屎山代码-牵一发而动全身-重构系统-演进 示例:订单服务(查询订单、创建订单、订单评价、支付……) 项目流程:讨论需求==数据库建模==项目开发==迭代数据库的设计==上线 2. 领域驱动开发 根据领域知识一步步驱动软件设计的过程就是领域驱动设计(DDD,Domain-Driven Design) 领域驱动设计(DDD)是一种处理高度复杂领域的设计思想 设计思想:通过分离技术实现的复杂性,并围绕业务概念构建领域模型来控制业务的复杂性 项目流程:领域模型=数据库设计 3. 战略设计和战术设计 领域驱动设计包括战略设计和战术设计两部分: 战略设计:从业务视角出发=》业务领域模型=》边界=》通用语言的限界上下文 战术设计:从技术视角出发=》技术实现=》实体、聚合根、值对象、领域服务…… 二、领域驱动设计的基础概念 1. 领域和子域 领域(业务问题域)具体指一种特定的范围或区域,就是用来确定范围的,范围就是边界 细分-限定-领域模型-代码实现 领域越大业务范围就越大 领域可以进一步划分为子领域(子域 更小的) 子…… 阅读全文