XAF是基于模型驱动的,模型是XAF的主线,模型在XAF中称为BusinessObject(有时也简称为BO),虽然TypesInfo存储了模块中的类型,但它大部分功能都是针对BusinessObject的 。
TypesInfo实例中包含了一个PersistentTypes属性,虽然名字显示的是持久化类型,但其实它也包含了非持久化类型,而PersistentTypes的数据是由IEntityStore提供,TypesInfo中包含多个IEntityStore,下面是PersistentTypes的源码 。
PersistentTypes中所有的类型都会在ApplicationModel中创建一个View节点 。
文章插图
官方文档中没有关于IEntityStore的介绍,与其相似的还有一个ITypeInfoSource,官方文档中也没有介绍,通过查看源码,大体知道了它们的含义,它们都有多个派生类,大部分都是重合的 。虽然TypesInfo包含了所有类型,但都是放在一个缓存当中的,类型也有不同的分类,主要是想将持久化类型(XPO中的类型)与非持久化类型进行单独的存储,在这里持久化类型与非持久化类型它们统称为Entity,而派生自IEntityStore的类,就是用于分别存储不同类型的Entity,例如:XpoTypeInfoSource是负责存储XPO中的类型,NonPersistentTypeInfoSource是负责存储非持久化对象类型(NonPersistentObject),IEntityStore主要负责Entity类型的存储,而ITypeInfoSource在负责类型存储的同时,也提供了对类型的操作,你可以通过ILSpy工具查看它们的更多内容 。下面是TypesInfo的创建方法,前面已介绍过
文章插图
在上面的代码中,我们可以看到TypesInfo会默认添加一个NonPersistentTypeInfoSource实例,在XAF初始化的过程中,还会添加一个XpoTypeInfoSource实例(这是默认情况下,如果你的系统中存在多个ObjectSpaceProvider,还会添加其它的) 。
类型子系统能做什么通过前面的介绍,我们知道TypesInfo可以为XAF功能模块提供所需的类型,也可以称为XAF的类型中心,官网提供了一个访问示例:https://docs.devexpress.com/eXpressAppFramework/113224/business-model-design-orm/types-info-subsystem/access-business-object-metadata
TypeInfo可以对成员(IMemberInfo)添加或修改,我们可以通过它来实现自定义TypeInfo,XAF提供了多种自定TypesInfo的方式,但我们一般会选择是在Module或Controller中,在Module或Controller中都是重写CustomizeTypesInfo方法,结果都是一样的,在选择上如果只会在某个Controller中调用,这样自定义与调用都放在一个Controller中会更加的直观,当然在Module中自定义会更加统一,这样你做了哪些自定义在Module中就能看到,这两种方式没有优劣,Controller中的自定义也只会调用一次 。官网提供了一个CustomizeTypesInfo示例:https://docs.devexpress.com/eXpressAppFramework/113583/business-model-design-orm/types-info-subsystem/use-metadata-to-customize-business-classes-dynamically
写在最后本篇文章主要介绍了类型子系统的概念及在XAF中的作用,与其它XAF概念的结合及应用会在后面的章节中介绍 。TypesInfo还有很多有用的属性与方法,想更加深入的了解,你还需要查阅官方文档,文档不全的可以结合源码 。
经验总结扩展阅读
- Briefings in Bioinformatics-2021 知识图谱-生物信息学-医学顶刊论文:生物信息学中的图表示学习:趋势、方法和应用
- 14 基于SqlSugar的开发框架循序渐进介绍-- 基于Vue3+TypeScript的全局对象的注入和使用
- kinforest是什么牌子的轮胎?
- info是什么意思?
- 车上info是什么意思?