Kephas.Model 包对于我对可扩展元数据的要求来说似乎有点重。有更轻的选择吗?

The Kephas.Model package seems a bit heavy weight for my requirements of extensible metadata. Is there a lighter alternative?

我的要求是为我们使用的实体使用某种元数据系统,但可扩展,这意味着除了查询属性和方法之外,我们还需要支持某种自定义元数据。标准 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 是一个 expando,允许在运行时添加动态值。

请注意 IRuntimeTypeInfo 特化了 ITypeInfo(在 Kephas.Reflection 命名空间中),它也是 Kephas.Model 中的基本接口。你是对的,Kephas.Model 提供了更复杂的功能,这可能对更复杂的元数据模型有意义,包括实体、服务、活动和任何你能想到的 classifiers,以及加载模型也来自 .NET 反射以外的来源(JSON、XML、数据库等)。

另一个方面是,直到5.2.0版本,IRuntimeTypeInfo将由密封的RuntimeTypeInfo class实现。从5.3.0版本开始,可以提供自己的实现,可以有多个。