## 2.4 ABPZero – 组织单位管理
2.4.1 简介
组织单位(OU)用于给组用户和实体分层
2.4.2 组织单位实体
一个OU由组织单位实体来展现。该实体基本的属性如下:
TenantId:OU的租户Id,host的组织单位的TenantId可以为空。
ParentId:父OU的Id,根OU的ParentId可以为空。
Code:租户下唯一的层级字符串。
DisplayName:OU的显示名称。
组织单位实体的主键(Id)是长整型,该实体从FullAuditedEntity继承,FullAuditedEntity提供了审计信息并实现了软删除接口。
1. 组织单位树
由于一个OU可以有父级OU,一个租户下所有的OU是树形结构,该树有如下规则:
可以有多个根节点(根节点的ParentId为空)
树的最大深度被定义为一个常量OrganizationUnit.MaxDepth,它的值是16。
第一层级子OU数有限制(由于固定的OU编码单位长度的原因,下面有相关解释)
2. OU编码
OU编码有组织单位管理器自动创建和维护,OU编码是类似下面的字符串:
“00001.00042.00005”
该编码可以轻易实现递归查询数据库中所有的子OU,该编码有如下规则:
对于某个租户来说,它是唯一的。
一个父OU的所有子OU的编码都以父OU的编码开头。
它的固定长度基于树中的OU层级决定,参见示例代码。
尽管OU编码是唯一的,但是在你移动一个OU的情况下它能被改变,因此我们应该通过OU的Id来引用OU,而不是OU的编码。
2.4.3 组织单位管理器
组织单位管理器类可以被注入并用于管理OU,常见用例如下:
创建、更新、删除一个OU。
在OU树中移动一个OU。
获取OU树及节点的信息。
1. 多租户
组织单位管理器被设计用来为单租户使用,它默认为当前租户使用。
2.4.4 常见用例
以下是OU的常见用例,相关示例的源代码请点这里。
1. 创建属于某个组织单位的实体
OU最明显的用例是将实体分配给某个OU,例如