Spiga

2024年5月的文章归档

ABP成长系列6:DDD

2024-05-25 11:56:40

摘要:ABP是一个面向DDD的项目框架,接下来的内容将学习如何利用ABP来落地DDD的项目,我们今天先来总结一下DDD的核心思想。 一、什么是领域驱动设计 1. 传统软件开发 业务梳理 == 软件设计 == 开发 初期-简单-迭代-复杂-冗杂-屎山代码-牵一发而动全身-重构系统-演进 示例:订单服务(查询订单、创建订单、订单评价、支付……) 项目流程:讨论需求==数据库建模==项目开发==迭代数据库的设计==上线 2. 领域驱动开发 根据领域知识一步步驱动软件设计的过程就是领域驱动设计(DDD,Domain-Driven Design) 领域驱动设计(DDD)是一种处理高度复杂领域的设计思想 设计思想:通过分离技术实现的复杂性,并围绕业务概念构建领域模型来控制业务的复杂性 项目流程:领域模型=数据库设计 3. 战略设计和战术设计 领域驱动设计包括战略设计和战术设计两部分: 战略设计:从业务视角出发=》业务领域模型=》边界=》通用语言的限界上下文 战术设计:从技术视角出发=》技术实现=》实体、聚合根、值对象、领域服务…… 二、领域驱动设计的基础概念 1. 领域和子域 领域(业务问题域)具体指一种特定的范围或区域,就是用来确定范围的,范围就是边界 细分-限定-领域模型-代码实现 领域越大业务范围就越大 领域可以进一步划分为子领域(子域 更小的) 子域对应一个更小的范围 我们来看一张经典的图 给桃树建立领域知识的步骤: 确定研究对象 对研究对象进行细分 对子对象再次进行细分 细分到最小单元 再来看一个电商项目的领域划分的例子: 电商领域可以分成:商品子域、销售子域、订单子域、物流子域 物流子域又可以分成:拣货子域、发货子域、派送子域 领域建模的过程和方法其核心思想就是将问题域逐步分解 降低业务理解和系统实现的复杂度 2. 核心域、通用域和支撑域 核心域:产品核心业务功能 通用域:被多个子域使用的通用功能(认证、授权、日志) 支撑域:既不包含业务核心功能,也不包含通用功能 电商平台中:销售子域是核心域,物流子域是支撑销售业务的,所以它的支撑域 植物研究领域中,需要根据不同情况来划分核心域 如果是在果园:果实就是核心域。为了让果实更饱满,果农可能会裁剪一些枝和叶 如果是在公园:花就是核心域 3. 通用语言 通过团队交流达成共识的,能够简…… 阅读全文

ABP成长系列4:认证授权

2024-05-11 11:49:34

摘要:ABP框架并不重新发明轮子去实现认证,而是完美集成并简化了上述ASP.NET Core的认证流程。 模块化封装:当你使用ABP的启动模板时,认证的配置通常已经在模块中预先配置好,你只需要在appsettings.json中提供必要的参数(如JWT的签发者、密钥等)。 依赖注入集成:ABP通过ICurrentUser提供了对当前登录用户ID (UserId) 和租户ID (TenantId) 的便捷访问。这个接口的背后实现正是基于HttpContext.User及其声明(Claims)。 多租户支持:ABP的认证系统天然支持多租户,可以正确处理不同租户下的用户登录和会话管理。 ABP的主要价值在于整合与简化,它让你在使用强大的ASP.NET Core认证机制的同时,享受到ABP模块化和约定优先开发模式带来的便捷。 要学习好ABP的认证授权模块,我们来看一下ASP.NET Core的认证授权。 一、ASP.NET Core认证授权 1. 基本流程 UseAuthentication + AddAuthentication UseAuthorization + AddAuthorization(.net源码内置) [Authorize] [AllowAnonymous] 未登陆—访问—登陆—访问—退出 2. 理解认证 认证就是鉴别是张三----解读请求携带的用户信息 信息位置:怎么传递的凭证?Cookie,JWT,Other 信息格式:凭证是什么格式,加密问题 信息有效性:token过期了、签名不对 认证后信息保存:保存到context.User里面 特殊情况处理:没登陆、没权限、没xxx,这些就是认证需要知道的,需要干的活儿 登陆是怎么配合的?HttpContext.SignInAsync完成用户信息的写入(如:Cookie) 3. 理解授权 授权:就是检测下用户到底有没有权限访问某个方法 认证和授权的关系? 没有直接关系,认证获取用户信息保存到context.User,授权去使用 授权的时候,会用Scheme去认证一下,还有异常处理 检测凭据: 标记特性[Authorize] [AllowAnonymous]—就做授权检测 ASP.NET Core提供了灵活且强大的授权策略模型,主要包括: 基于角色的授权 ([Authorize(Roles =…… 阅读全文

ABP成长系列3:DI

2024-05-04 11:03:40

摘要:前面重点介绍了ABP.vNext的模块化,以及模块化带来的核心价值动态API,今天我们开看一下ABP DI的扩展。 一、ABP DI功能介绍 1. 组件自动注册 SkipAutoServiceRegistration AddAssemblyOf AddAssembly public class BlogModule : AbpModule { public override void PreConfigureServices(ServiceConfigurationContext context) { SkipAutoServiceRegistration = true; } public override void ConfigureServices(ServiceConfigurationContext context) { context.Services.AddAssemblyOfBlogModule(); } } 2. 默认的注册 模块类注册为singleton MVC控制器(继承Controller或AbpController)被注册为transient MVC页面模型(继承PageModel或AbpPageModel)被注册为transient MVC视图组件(继承ViewComponent或AbpViewComponent)被注册为transient 应用程序服务(实现IApplicationService接口或继承ApplicationService类)注册为transient 存储库(实现IRepository接口)注册为transient 域服务(实现IDomainService接口)注册为transient 3. 依赖接口 ITransientDependency 注册为transient生命周期 ISingletonDependency 注册为singleton生命周期 IScopedDependency 注册为scoped生命周期 4. 特性 DependencyAttribute:控制服务的注册行为和生命周期 ExposeServicesAttribute:控制服务以哪些类型注册到容器中 [ExposeServices(typeof(…… 阅读全文