我的要求是为我们使用的实体使用某种元数据系统,但可扩展,这意味着除了查询属性和方法之外,我们还需要支持某种自定义元数据。标准 Type/TypeInfo 类在某种程度上很有用,但无法自定义它们以添加特定属性来支持我们拥有的各种模式:树节点、主细节等。
Kephas.Model 提供了一个复杂的基础设施来支持这种情况,包括混合和维度等高级功能,但这对于我们的系统来说有点太多了。对于我们拥有的代码优先实体,我们需要一些更轻量级的东西。
对于我们可以将什么用于此类要求,是否有建议?我注意到Kephas.Reflection命名空间,这似乎是一个合适的候选者,但我不确定如何正确使用它。
没错,Kephas.Runtime
命名空间通过基本IRuntimeTypeInfo
接口(在Kephas.Core
包中)提供轻量级可扩展元数据。使用扩展方法访问它主要有两种方法:
// get the type information from an object/instance.
var typeInfo = obj.GetRuntimeTypeInfo();
// convert a Type/TypeInfo to a IRuntimeTypeInfo
typeInfo = type.AsRuntimeTypeInfo();
从这里开始,您可以操作属性、字段、方法、注释(属性)等,通常按其名称进行索引。一个非常好的功能是IRuntimeTypeInfo
是一个扩展,允许在运行时添加动态值。
请注意,IRuntimeTypeInfo
专门ITypeInfo
(在Kephas.Reflection
命名空间中),这也是Kephas.Model
中的基本接口。您是对的,Kephas.Model
提供了更复杂的功能,这些功能可能对更复杂的元数据模型有意义,包括实体、服务、活动和您能想到的任何分类器,以及从 .NET 反射(JSON、XML、数据库等)以外的源加载模型。
另一方面是,在版本 5.2.0 之前,IRuntimeTypeInfo
将由密封的RuntimeTypeInfo
类实现。 从版本 5.3.0 开始,可以提供您自己的实现,这些实现可以有多个。