XAF新手入门 - 数据字典示例
前言
通过前面文章的介绍,大家应该对模块与类型信息子系统有所了解,再通过一个示例来加深大家对它的理解。
在准备写这个系列文章之前,就准备是概念+示例的组合,这样大家对概念的理解会更深刻。之前的规划是在讲到一个比较重要的概念或多个概念时给出一个示例,示例也是针对大家都熟悉的场景(如:学生),虽然也能描述出概念中的知识点,但事后考虑到实用性不强,不能直接应用到实际项目中,所以改变了一下思路,以后的示例会更注重实用,示例中的项目可以间接或直接的应用到实际项目中。
示例概述
数据字典几乎每个项目中都会涉及到,有的会将每一个字典分别采用不同的实体表,由于字典的结构差不多,所以有的会共用一个实体表。我们当前的示例就是共用一个实体表的数据字典,先说一下它的使用方法,代码如下:
示例代码放到了码云(https://gitee.com/easyxaf/data-dictionaries),以后示例的项目都是以EasyXaf开头。

在BO(BusinessObject)中添加上面的代码,BO中的性别与岗位就是一个字典数据了,性别是单选的,岗位是多选的,效果如下图:

下面是管理数据字典的界面,字典列表:

字典项管理:

整个示例的核心代码很少,大部分工作都是XAF帮我们完成了。
实现思路
先看一下整个项目的结构:

EasyXaf.DataDictionaries是整个项目的核心,它是一个独立的XAF模块项目,可直接应用到其它的XAF项目中,其它两个是由XAF向导生成,用于演示本示例的。
EasyXaf.DataDictionaries项目结构:

XPO的一个知识点,在XPO中是不能直接关联(Association)一个外部程序集中的BO(BusinessObject),XAF中自身的BO都是放在同一个程序集中的(DevExpress.Persistent.BaseImpl.Xpo),所以不存在这样的限制。如果我们的BO都放到同一个程序集中,这样项目的模块化会有一定限制。XPO给出了两个解决方案,一种是在AssociationAttribute中传入程序集的名称及类型的全名(都是字符串),还有自定义XPO的元数据(在XAF中是在Module的CustomizeTypesInfo方法中进行定义的),我们的示例项目采用了后者,它更加的灵活。
我们整个示例项目的核心代码都是在CustomizeTypesInfo中,通过TypesInfo对符合条件的BO进行自定义,在运行时添加成员及Attribute。代码如下

代码中已包含了详细的注释,大家可以根据注释去了解它的工作原理。
为了能够在启动时自动收集所用到的数据字典,我们在Updater中收集了项目的所有数据字典,并将其添加到数据库中,代码如下:

关于如何引用EasyXaf.DataDictionaries,在模块章节中已进行了详细的描述,大家也可以参考示例代码
总结
数据字典示例主要是基于XAF中的业务类元数据来完成的,并且示例项目还是一个独立的XAF模块,所以它把模块与类型信息子系统的知识都涉及到了。如果你想开发独立的XAF模块,并且想广泛应用到其它项目中,业务类元数据是不可缺少的。
XAF数据字典项目地址:https://gitee.com/easyxaf/data-dictionaries
XAF新手入门 - 数据字典示例的更多相关文章
- XAF新手入门 - 前言
很多小伙伴在第一次接触XAF时,会被它的丰富功能及开箱即用的特点所吸引,即使在不了解XAF的情况下,也能够依葫芦画瓢创建一个功能丰富的应用,但当应用到实际项目中时,你会发现与之前的愿景差距很大,很多都 ...
- XAF新手入门 - 类型子系统(Types Info Subsystem)
类型子系统概述 类型子系统是XAF的核心概念,但我们平时却很少关注它,它集中存储了模块中的类型,它是生成应用程序模型(Application Model)的基础,它与XAF中其它的概念都有所关联,了解 ...
- XAF新手入门 - 模块(Module)
模块概述 谈到模块大家应该都不会感到陌生,不管是前端还是后端都有模块的概念,XAF中的模块概念与大多数框架中的模块概念是相通的.XAF模块首先是一个.NET类库,同时它还包含一个继承自ModuleBa ...
- 新手入门指导:Vue 2.0 的建议学习顺序
起步 1. 扎实的 JavaScript / HTML / CSS 基本功.这是前置条件. 2. 通读官方教程 (guide) 的基础篇.不要用任何构建工具,就只用最简单的 <script> ...
- 原创:从零开始,微信小程序新手入门宝典《一》
为了方便大家了解并入门微信小程序,我将一些可能会需要的知识,列在这里,让大家方便的从零开始学习:一:微信小程序的特点张小龙:张小龙全面阐述小程序,推荐通读此文: 小程序是一种不需要下载.安装即可使用的 ...
- 课程上线 -“新手入门 : Windows Phone 8.1 开发”
经过近1个月的准备和录制,“新手入门 : Windows Phone 8.1 开发”系列课程已经在Microsoft 虚拟学院上线,链接地址为:http://www.microsoftvirtuala ...
- discuz插件开发新手入门 超详细
作为一个新手,目前也是刚刚玩转discuz的插件功能,好东西不敢独享,就拿出来大家一起分享入门的过程.现在网上很多关于discuz的插件教程都是很简单的教程,原因可能是这个东西是商业化的东西,本着分享 ...
- XML新手入门 创建构造良好的XML(1)
XML新手入门 创建构造良好的XML(1) 2009-03-19 09:24 Kay Whatley IBM Developerworks 我要评论(0) 字号:T | T 本文描述了构建良好的XML ...
- discuz 插件开发 新手入门
作为一个新手,目前也是刚刚玩转discuz的插件功能,好东西不敢独享,就拿出来大家一起分享入门的过程.现在网上很多关于discuz的插件教程都是很简单的教程,原因可能是这个东西是商业化的东西,本着分享 ...
- Xorboot-UEFI新手入门教程
Xorboot-UEFI新手入门教程 Xorboot-UEFI是一款UEFI下轻量级的图形化多系统引导程序,pauly于2014年国庆节期间发布了预览版.搜了下论坛,关于Xorboot- ...
随机推荐
- 深入探索OCR技术:前沿算法与工业级部署方案揭秘
深入探索OCR技术:前沿算法与工业级部署方案揭秘 注:以上图片来自网络 1. OCR技术背景 1.1 OCR技术的应用场景 OCR是什么 OCR(Optical Character Recogniti ...
- 多路io复用Select [补档-2023-07-16]
select 2.1 简介 select函数可以用于实现高效的多路复用 I/O,同时处理多个文件描述符的事件,包括监听可读.可写和异常条件,具有阻塞和非阻塞模式,并可以设置超时时间.这使得程序能够 ...
- Intel自曝未来三代酷睿!AI性能涨2倍、再涨2倍
根据最新财报数据,Intel 2023年第四季度154.1亿美元,同比增长10%,全年收入542亿美元,同比下跌14%,预计2024年第一季度收入122-132亿美元. 其中,酷睿处理器业务为主的CC ...
- 手撕红黑树 | 变色+旋转你真的明白了吗?【超用心超详细图文解释 | 一篇学会Red_Black_Tree】
说在前面 我们也很久没有更新数据结构系列了,半年前博主重新深入学习了红黑树这个数据结构,一直想更新呈现给大家,最近也一直没有时间,今天红黑树它来了! 博主为了这篇博客,做了很多准备,试了很多画图软件, ...
- TF-VAEGAN:添加潜在嵌入(Latent Embedding)的VAEGAN处理零样本学习
前面介绍了将VAE+GAN解决零样本学习的方法:f-VAEGAN-D2,这里继续讨论引入生成模型处理零样本学习(Zero-shot Learning, ZSL)问题.论文"Latent Em ...
- P5047 [Ynoi2019 模拟赛] Yuno loves sqrt technology II 题解
题目链接:Yuno loves sqrt technology II 很早以前觉得还挺难的一题.本质就是莫队二次离线,可以参考我这篇文章的讲述莫队二次离线 P5501 [LnOI2019] 来者不拒, ...
- Oracle查询存在外键约束但未创建对应索引的情况
1.Oracle提供的脚本 2.网络搜索到的脚本 3.改为可以指定用户的脚本 4.测试脚本使用 1.Oracle提供的脚本 如果要求管控严格,可以考虑使用Oracle官方提供的脚本. Script t ...
- 顺着这份Java面试地图,国内一二线互联网公司随便进...
原创:陶朱公Boy(微信公众号ID:taozhugongboy),欢迎分享,转载请保留出处. 前言 临近春节,这几天手头没什么事情,花了点时间,将自己近两年收集的面试真题,进行了一番深度归纳总结,整理 ...
- NEMU PA 1 实验报告
课程地址: PA1-1 https://www.bilibili.com/video/BV1JE411J7AK PA1-2 https://www.bilibili.com/video/BV1EE41 ...
- Codeforces Round #887 (Div. 2) A-D
比赛链接 A 代码 #include <bits/stdc++.h> using namespace std; using ll = long long; int a[507]; bool ...