ABP源码分析四十:ZERO的Application和Tenant
ABP的Zero模块以数据库为数据源实现了ABP框架中的tenant management (multi-tenancy), role management, user management, session, authorization (permission management), setting management, language management, audit logging等核心功能。ABP中的这些功能具体实现都依赖外部的持久层,所以ABP框架中仅仅定义了接口和一些空的实现。而对这些功能真正的实现则交给Zero这类模块。
Zero模块主要的代码也很简单,就是针对这些功能模块的领域逻辑的实现,所以无非就是定义实体,实体关系,以及相关的CRUD操作。
Edition:继承自FullAuditedEntity实体类。表示一个application的版本。下图表示其去另外两个Entity的关系。
EditionFeatureSetting:继承自FeatureSetting。表示一个与具体Edition关联的Feature
FeatureSetting:继承自CreationAuditedEntity<long>的实体类。 封装了FeatureSetting的name和value

AbpTenant:继承自FullAuditedEntity实体类。表示Tenant.

AbpEditionManager:处理与Edition相关的邻域逻辑。其引用了两个对象:EditionRepository 和EditionFeatureRepository(IRepository<Edition>和 IRepository<EditionFeatureSetting, long> 的实例,图中用红色标注)。AbpEditionManager通过EditionRepository 实例完成Edition的CRUD操作,通过EditionFeatureRepository完成EditionFeatureSetting 实例的CRUD操作。
这里要注意AbpEditionManager实例了两个事件处理器的接口,用于响应Edition以及EditionFeatureSetting发生改变时触发的事件。这边的具体事件处理函数完成将Edition以及EditionFeatureSetting实例从缓存中删除。


EditionfeatureCacheItem:这个类实例被用于缓存,其字典集合FeatureValues用于保存与某个edition对应的FeatureSetting。

AbpFeatureValueStore:这是一个抽象基类。其提供了一个方法GetValueOrNullAsync根据tenant的指定feature的值。该方法内部是通过调用AbpTenantManager的实例来完成的。如果feature和edition相关,还需要调用AbpEditionManager的相应方法来获取feature的value.

TenantFeatureSetting:继承自FeatureSetting。表示一个与具体Tenant关联的Feature
TenantFeatureCacheItem:与EditionfeatureCacheItem相似。这个类实例被用于缓存,其字典集合FeatureValues用于保存与某个Tenant对应的FeatureSetting。

TenantFeatureCacheItemInvalidator:实现了IEventHandler接口中的HandleEvent方法,以相应TenantFeatureSetting实体对象发生变化时,将其从缓存中删除。

IMustHaveTenant:该接口标识其Entity与tenant有关联关系,但是这关联关系是必须的。
IMayHaveTenant :该接口标识其Entity与tenant有关联关系,但是这关联关系不是必须的。

AbpTenantManager:处理与Tenant相关的邻域逻辑。其引用了两个对象:TenantRepository 和TenantFeatureRepository(IRepository<Tenant>和 IRepository<TenantFeatureSetting, long> 的实例,图中用红色标注)。AbpEditionManager通过TenantRepository 实例完成Tenant的CRUD操作,通过TenantFeatureRepository完成TenantFeatureSetting 实例的CRUD操作。
这里要注意AbpTenantManager实例了两个事件处理器的接口,用于响应Tenant以及Edition发生改变时触发的事件。这边的具体事件处理函数完成将Tenant以及EditionFeatureSetting实例从缓存中删除。


ABP源码分析四十:ZERO的Application和Tenant的更多相关文章
- ABP源码分析四十二:ZERO的身份认证
ABP Zero模块通过自定义实现Asp.Net Identity完成身份认证功能, 对Asp.Net Identity做了较大幅度的扩展.同时重写了ABP核心模块中的permission功能,以实现 ...
- ABP源码分析四十四:ZERO的配置
ABP Zero模块中需要配置的地方主要集中在三块:配置静态的role,配置外部认证源,以及配置本地化语言和资源. UserManagementConfig/IUserManagementConfig ...
- ABP源码分析四十五:ABP ZERO中的EntityFramework模块
AbpZeroDbContext:配置ABP.Zero中定义的entity的Dbset EntityFrameworkModelBuilderExtensions:给PrimitiveProperty ...
- ABP源码分析四十六:ABP ZERO中的Ldap模块
通过AD作为用户认证的数据源.整个管理用户认证逻辑就在LdapAuthenticationSource类中实现. LdapSettingProvider:定义LDAP的setting和提供Defaut ...
- 使用react全家桶制作博客后台管理系统 网站PWA升级 移动端常见问题处理 循序渐进学.Net Core Web Api开发系列【4】:前端访问WebApi [Abp 源码分析]四、模块配置 [Abp 源码分析]三、依赖注入
使用react全家桶制作博客后台管理系统 前面的话 笔者在做一个完整的博客上线项目,包括前台.后台.后端接口和服务器配置.本文将详细介绍使用react全家桶制作的博客后台管理系统 概述 该项目是基 ...
- ABP源码分析二十四:Notification
NotificationDefinition: 用于封装Notification Definnition 的信息.注意和Notification 的区别,如果把Notification看成是具体的消息 ...
- ABP源码分析三十四:ABP.Web.Mvc
ABP.Web.Mvc模块主要完成两个任务: 第一,通过自定义的AbpController抽象基类封装ABP核心模块中的功能,以便利的方式提供给我们创建controller使用. 第二,一些常见的基础 ...
- ABP源码分析四:Configuration
核心模块的配置 Configuration是ABP中设计比较巧妙的地方.其通过AbpStartupConfiguration,Castle的依赖注入,Dictionary对象和扩展方法很巧妙的实现了配 ...
- ABP源码分析二十六:核心框架中的一些其他功能
本文是ABP核心项目源码分析的最后一篇,介绍一些前面遗漏的功能 AbpSession AbpSession: 目前这个和CLR的Session没有什么直接的联系.当然可以自定义的去实现IAbpSess ...
随机推荐
- 01.SQLServer性能优化之----强大的文件组----分盘存储
汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 文章内容皆自己的理解,如有不足之处欢迎指正~谢谢 前天有学弟问逆天:“逆天,有没有一种方 ...
- JavaScript权威指南 - 函数
函数本身就是一段JavaScript代码,定义一次但可能被调用任意次.如果函数挂载在一个对象上,作为对象的一个属性,通常这种函数被称作对象的方法.用于初始化一个新创建的对象的函数被称作构造函数. 相对 ...
- 利用snowfall.jquery.js实现爱心满屏飞
小颖在上一篇一步一步教你用CSS画爱心中已经分享一种画爱心的方法,这次再分享一种方法用css画爱心,并利用snowfall.jquery.js实现爱心满屏飞的效果. 第一步: 利用伪元素before和 ...
- 将表里的数据批量生成INSERT语句的存储过程 增强版
将表里的数据批量生成INSERT语句的存储过程 增强版 有时候,我们需要将某个表里的数据全部或者根据查询条件导出来,迁移到另一个相同结构的库中 目前SQL Server里面是没有相关的工具根据查询条件 ...
- .Net多线程编程—任务Task
1 System.Threading.Tasks.Task简介 一个Task表示一个异步操作,Task的创建和执行是独立的. 只读属性: 返回值 名称 说明 object AsyncState 表示在 ...
- Cocos2d Android 环境搭建
1.在开始之前,需要先准备好资源如下,如果安卓开发环境有了直接装第3.4. 1.JDK 点击下载 (1.6) 2.ADT(已经自带Android SDK)点击下载 3.NDK 点击下载 4. ...
- [C#][算法] 用菜鸟的思维学习算法 -- 马桶排序、冒泡排序和快速排序
用菜鸟的思维学习算法 -- 马桶排序.冒泡排序和快速排序 [博主]反骨仔 [来源]http://www.cnblogs.com/liqingwen/p/4994261.html 目录 马桶排序(令人 ...
- JavaScript自定义媒体播放器
使用<audio>和<video>元素的play()和pause()方法,可以手工控制媒体文件的播放.组合使用属性.事件和这两个方法,很容易创建一个自定义的媒体播放器,如下面的 ...
- 算法与数据结构(十四) 堆排序 (Swift 3.0版)
上篇博客主要讲了冒泡排序.插入排序.希尔排序以及选择排序.本篇博客就来讲一下堆排序(Heap Sort).看到堆排序这个名字我们就应该知道这种排序方式的特点,就是利用堆来讲我们的序列进行排序.&quo ...
- Mysql 学习之基础操作
一.表复制 1.复制表结构 将表hello的结构复制一份为表hello3 2.复制数据 a.如果两张表的结构一样且你要复制所有列的数据 mysql> insert into hello3 ...