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