Types Info Subsystem XAF新手入門 - 類型子系統

類型子系統概述類型子系統是XAF的核心概念,但我們平時卻很少關注它,它集中存儲了模塊中的類型,它是生成應用程序模型(Application Model)的基礎,它與XAF中其它的概念都有所關聯,了解它可以使我們加深對XAF的理解 。
類型子系統是什么第一次接觸類型子系統的小伙伴 , 應該感覺它與.NET中的類型系統是相似的 , 并且它中的一些接口與類與.NET類型系統也是對應的,如:ITypeInfo,IMemberInfo,IAssemblyInfo,是不是感覺很熟悉 , 其實XAF類型子系統就是對.NET類型系統的一個包裝,并加入了一些XAF特有的功能,下面是XafApplication的構造函數 。

Types Info Subsystem XAF新手入門 - 類型子系統

文章插圖
TypesInfo是ITypesInfo的唯一派生類 , 它是類型子系統的核心,它提供了類型子系統的大部分功能,它也是類型子系統的代名詞 。
XafApplication構造函數中唯一需要傳遞的參數就是ITypesInfo,從這點也可以看出類型子系統在XAF中的重要性 。TypesInfo的實例是通過XafTypesInfo以單例形式提供的(XafTypesInfo.Instance),需要注意在整個XAF項目中只有這一個TypesInfo實例,在不同的平臺(WinForm與Blazor)下也是一樣的,下面是XafTypesInfo創建TypesInfo實例的方法 。
在XAF項目中的任何地方,你都可以直接使用XafTypesInfo.Instance訪問到TypesInfo實例,在Blazor中ITypesInfo已被注入到容器中,你可以通過ServiceProvider.GetService<ITypesInfo>()獲取TypesInfo實例,實際也是指向XafTypesInfo.Instance 。

Types Info Subsystem XAF新手入門 - 類型子系統

文章插圖
使用過XAF一段時間的小伙伴應該都知道XAF模塊中的一些資源(BusinessObject、Controller等)都是通過反射(Reflection)方式進行收集的,而反射是有一定性能損耗的,如果在每次需要的時候都反射一次,系統的性能損耗會很大 。TypesInfo會在XAF初始化時(Application.Setup),對模塊(XAF模塊)類庫中的類型進行收集并緩存起來,不會對非模塊類庫進行收集,除非在Module類中進行了導出(如何導出非本模塊中的類型,會在后續的章節中進行介紹) 。
TypesInfo收集的類型(System.Type)會通過TypeInfo進行包裝,類型的公共字段或屬性是通過IMemberInfo進行包裝,同時TypesInfo也提供了更加豐富的功能 。在還沒有深入了解TypesInfo之前,你可以簡單的將TypesInfo理解為是對模塊中類型的緩存 , 并提供了一些對緩存類型的操作方法(如:創建、更新、查找等) 。
.NET中的反射常用于框架的開發,框架可以通過反射收集類型的信息,并通過這些類型信息輔助完成一些功能,XAF也是一個開發框架,TypesInfo承擔了類型信息收集的角色,理所當然成了XAF的類型中心,其它功能模塊就可以通過TypesInfo訪問到自己所需的類型 。
應用程序模型(Application Model)就是基于TypesInfo創建了模型中的Controller、Action、View等節點,關于應用程序模型,會在后面章節講解 。
DevExpress.ExpressApp.DC命名空間下包含了XAF類型子系統的主要類型,大家可以通過ILSpy等類似工具查看該命名空間下類型之間的依賴關系 。
說一個小插曲,DC在XAF中就是DomainCompnent(域組件),ApplicationModel是基于DomainComponent的,BusinessObject中的NonPersistentObject也是基于DomainComponent的 , 在更早之前XPO有一個基于DomainComponent自動生成PersistentObject的功能(現在它已被棄用了),在這些DomainComponent當中,感覺ApplicationModel與XPO的DomainComponent很類似,都是基于接口的,NonPersistentObject只借用了DomainComponent這個概念 , 使用了DomainComponentAttribute , 但在工作原理上與前兩個有很大的區別 。由于官方文檔中沒有關于它們之間關系的描述,以上的觀點更多的只是個人的見解,有熟悉的小伙伴可以在評論區說說你的看法 。
XAF是基于模型驅動的,模型是XAF的主線,模型在XAF中稱為BusinessObject(有時也簡稱為BO),雖然TypesInfo存儲了模塊中的類型,但它大部分功能都是針對BusinessObject的 。
TypesInfo實例中包含了一個PersistentTypes屬性,雖然名字顯示的是持久化類型 , 但其實它也包含了非持久化類型 , 而PersistentTypes的數據是由IEntityStore提供 , TypesInfo中包含多個IEntityStore,下面是PersistentTypes的源碼 。
PersistentTypes中所有的類型都會在ApplicationModel中創建一個View節點 。

推薦閱讀