鉴别器
Zongsoft.Components Discriminator 识别器和插件构件装配。
IDiscriminator 是一个很小但很有用的接口:它让一个容器对象根据输入参数识别目标类型或目标子集合。插件构件装配时,如果父对象实现了识别器,就可以把子构件追加到正确的位置,而不是只能依赖固定的属性名或集合类型。
它适合解决“同一个节点下允许多种子对象”的装配问题。识别器把类型判断留给领域容器本身,而不是让插件构建器猜测每一种集合属性。
关键类型
IDiscriminator
定义 Discriminate(object argument),根据参数返回识别结果。
权限分类示例
PrivilegeCategory 同时包含子分类集合和权限集合。它实现 IDiscriminator 后,可以根据输入内容返回应该追加到哪个集合。
来源:framework/Zongsoft.Core/src/Security/Privileges/PrivilegeCategory.cs(节选;上下文见源文件)。
object IDiscriminator.Discriminate(object argument)
{
switch(argument)
{
case string type:
if(string.IsNullOrEmpty(type) || string.Equals(type, nameof(Category), StringComparison.OrdinalIgnoreCase))
return this.Categories;
if(string.Equals(type, nameof(Privilege), StringComparison.OrdinalIgnoreCase))
return this.Privileges;
break;
case Privilege:
return this.Privileges;
case PrivilegeCategory:
return this.Categories;
}
return null;
}这是核心权限分类的实际实现。空类型名与 Category 指向子分类集合,Privilege 指向权限集合,字符串比较忽略大小写;无法识别时返回空。Discussions 的插件挂载仍遵循同一构件装配规则,但未定义自己的 IDiscriminator。
插件装配中的用途
Zongsoft.Plugins 中的 BuiltinType 会先询问拥有者或默认成员是否实现 IDiscriminator,如果返回 Type 源码 或集合,就用它判断构件类型。ObjectBuilder 在追加子对象时也会先调用容器的识别器,把子对象交给正确的集合。
这种设计特别适合“一个节点下可能包含多种子对象”的插件结构,例如权限分类下既能放权限项,也能放子分类。
IDiscriminator 适合容器内部有清晰分类规则的场景。如果子对象只有一个固定集合属性,直接公开集合或属性通常更简单。识别规则也应保持可预测,尽量不要依赖外部状态或会频繁变化的运行时条件。
参考实现
最后更新于