AAF灵便应用框架简介系列(3):对象模型
IAgileObject接口定义如下:
public interface IAgileObject : IIdentifiable
{
// 灵便对象的Id默认采用UUID,也可以由外部指定或者根据一定的组装格式组装(如订单条目Id可以由订单编号及产品
// 编号组装而成)。在指定了Id由组装而成时,当外部代码显失设置好了组装所有的信息后,可以显式调用本方法,虽然
// 不调用也不会有任何问题,但是外部代码必须保证在保存(包括因为保存其他对象而连带保存本对象)前组装所需的
// 信息都已提前准备好。如果有必要的话,这一话题在后续介绍中还会详细展开。一般情况下,不建议使用Id的组装功能。
// 默认地,Id长度为32个字符。考虑到缓存等特性,Id总是在对象被保存前被手工或自动创建,而不会等到保存到数据库
// 后再由数据库创建。目前AAF限制所有AgileObject的Id必须为字符串。
void AssembleId();
// 对象是否为批量加载起来的
bool GetIsBatchLoaded();
// 获取该对象的最后刷新时间
DateTime GetLastRefreshed();
// 判断一个值是否可被作为该对象的Id。
bool IsIdAcceptable(object id);
void Recover();
// 该方法由内核调用,一般不要操作这个方法
void ResetDirty(bool includeRelations, bool includeChildren);
// 该方法由内核调用,一般不要操作这个方法
void ResetDirty(bool includeRelations, bool includeChildren, bool rollback);
// 该方法由内核调用,一般不要操作这个方法
void ResetNew();
// 该方法由内核调用,一般不要操作这个方法
void ResetRelationsDirty(bool includeRelItems, bool includeChildren);
// 该方法由内核调用,一般不要操作这个方法
void ResetRelationsDirty(bool includeRelItems, bool includeChildren, bool rollback);
// 该方法由内核调用,一般不要操作这个方法
void SetIsBatchLoaded(bool val);
// 挂起一个数据,执行本操作后,AgileObject的IsSuspent属性为true,外部应用可以根据此属性来决定挂起的具体含义。
void Suspend();
// 该方法由内核调用,一般不要操作这个方法
void TouchLastRefreshed();
// 对象的类型全名(含程序集名),如:"XX.Order.Imp.Order, XX.Order.Imp"
string FullTypeName { get; }
// 获取或设置对象Id,一般不应从外部设置对象Id,如果是外部设置,外部程序应保证Id在特定范围内的唯一性。对象的
// Id只能被有效设置一次。有效设置之后的再次设置将会被拒绝。考虑到同一类型的多个衍生类型可以被保存到同一个数
// 据表中,在外部设置Id时,其唯一性要求需要仔细考虑。外部不设置对象Id时,系统在恰当的时机(某处读取对象Id时,
// 对于内核而言,在保存对象时是需要读取对象Id的)会自动创建对象Id。对象Id默认为转化为字符串的32位UUID。
object Id { get; set; }
// 是否被挂起或删除。对象的删除有两种形式:一种是彻底删除,一种是加删除标记(通过将IsDeleted设置为true)。具
// 体某种对象是哪一种情况,取决于该对象类型的AgileObjectStorageAttribute的IsDeletePermanently属性。如果数据对
// 象未被删除或挂起,则返回true,这具体意味着什么,则由应用自行决定。
bool IsActive { get; }
// 数据是否可删除,提供一个有用的开关,当本属性为true时,IsDeleted无法被改变为true。
bool IsDeletable { get; set; }
// 删除标记
bool IsDeleted { get; set; }
// 对象在上次保存、刷新、加载以来,IsDeleted属性是否发生改变。
ChangeType IsDeletedChange { get; }
bool IsDirty { get; }
bool IsLoading { get; set; }
bool IsLoadingRelas { get; set; }
// 是否是一个新创建(新加载的对象不算“新”对象)并且还没有保存的对象。
bool IsNew { get; }
// 挂起标记
bool IsSuspent { get; set; }
// 对象在上次保存、刷新、加载以来,IsSuspent属性是否发生改变。
ChangeType IsSuspentChange { get; }
// 提供一个索引器,使得在需要时外部可以通过本索引器以及属性的名称来访问个各属的值。这在一些无法预知对象的实际
// 具体类型,而只知道该对象是一个AgileObject时是有用的。如我们可以通过agileObject["Name"]达到获取agileOject对象
// 的Name属性的目的。
object this[string name] { get; set; }
// 对象的最后一次更新提交时间。对象可以被随时通过调用IPersister的SaveAgileObject/SaveObjects方法保存。但真正的
// 保存只发生在对象确实有属性变更时,只有在这种棋况下,LastModified才会在保存时发生改变,否则什么都不会发生,
// 对象也根本不会被保存。
DateTime LastModified { get; set; }
// 可通过这个数据词典获取对象上次保存、刷新或加载的各属性取值。
IDictionary OriginalValues { get; }
// 数据的存储别名。一种对象可以被持久化在多个数据表甚至多个数据库中,本属性记录了该对象来自哪一个存储别名。本属性
// 由AAF内核维护,应用程序可以读取,但一般情况下情不要修改。
string StorageAlias { get; set; }
// 获取数据对象的Id
string StringId { get; }
// 获取数据对象的类型描述(描述对象有那些字段,有哪些关系和关联)
ITypeDescription TypeDescription { get; set; }
...
}
在实际应用中,AgileObject对象之间总是存在着各种关系和关联。那么什么是关系?什么是关联?二者在AAF中如何表述呢?下面我们一起来回答这几个问题。
什么是关系。简而言之,关系就是两个灵便对象之间的一对多,多对多关系。在具体表述上,其形式为一个对象被标识为另一个对象的一个IAgileRelation。大家可能还记得我在AAF介绍系列的开篇前言中给出的Order/OrderItem的示例。在该示例中,通过在Order中的这两句代码定义了一个Order及OrderItem之间的一对多关系:
[Relation(ChildType = typeof(OrderItem), RelationType = typeof(FreeAgileRelation)]
public IAgileRelation OrderItems;
其中RelationAttribute的ChildType属性声明了这一一对多关系的“多”为OrderItem。RelationAttribute的RelationType有两种取值,其一为:typeof(FreeAgileRelation),其二为typeof(SimpleAgileRelation)。后者在多应用实例情况下进行缓存同步有一定的难度,因此,目前已经不推荐使用。一般情况下直接写作RelationType = typeof(FreeAgileRelation)即可。
实际上,IAgileRelation不仅仅支持一对多的关系。通过RelationAttribute的更多属性设置,IAgileRelation可以支持多对多甚至多对多对多(也就是在多对多的基础上,两个具体实例之间还可以同时有多个“同名”关系,所谓同名关系就是说存放在同一个类型的同一个IAgileRelation实例中的关系)。也就是说IAgileRelation甚至可以被用来描述复杂的连接图。IAgileRelation的接口定义如下:
...
帖子内容太长,论坛无法完整发出。有兴趣的朋友请到我的博客:http://blog.csdn.net/aafshzj小坐,看看全文。
相关推荐
springboot项目基于Web的就业管理系统_w.zip
springboot项目基于Web的就业管理系统_w,含有完整的源码和报告文档
基于Web的就业管理系统_w3209-springboot毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
包内含有部署教程以及环境,项目都是可以正常运行的。 在现代Web应用开发中,我们采用了一系列先进的技术和工具来构建高效、可扩展的系统。后端方面,Spring Boot框架为我们提供了一个快速开发的环境,而MyBatis和MyBatis Plus简化了数据库操作。为了处理JSON数据,我们选择了Gson和Jackson,同时利用Fastjson进行高效的数据解析。Hutool提供了各种便捷的工具方法,而Baidu AI SDK使得集成百度人工智能服务变得简单。Apache POI和Apache HttpClient分别用于处理Office文档和执行HTTP请求。前端开发使用了Vue.js框架结合Element UI组件库,以及jQuery和Bootstrap来实现响应式设计。我们还使用Vue CLI、ESLint、Babel等工具来优化前端开发流程。Sass帮助我们快速编写CSS,而Vuex和Vue Router分别解决了状态管理和路由问题。最后,Axios负责前端与后端之间的通信。这些技术协同工作,使得从数据库操作到前端界面构建的每一个环节都高效、可靠。 Spring Boot是Spring框架的一个模块,它简化了基于Spring应用程序的创建和部署过程。Spring Boot提供了快速启动Spring应用程序的能力,通过自动配置、微服务支持和独立运行的特性,使得开发者能够专注于业务逻辑,而不是配置细节。Spring Boot的核心思想是约定优于配置,它通过自动配置机制,根据项目中添加的依赖自动配置Spring应用。这大大减少了配置文件的编写,提高了开发效率。Spring Boot还支持嵌入式服务器,如Tomcat、Jetty和Undertow,使得开发者无需部署WAR文件到外部服务器即可运行Spring应用。 Java是一种广泛使用的高级编程语言,由Sun Microsystems公司(现为Oracle公司的一部分)在1995年首次发布。Java以其“编写一次,到处运行”(WORA)的特性而闻名,这一特性得益于Java虚拟机(JVM)的使用,它允许Java程序在任何安装了相应JVM的平台上运行,而无需重新编译。Java语言设计之初就是为了跨平台,同时具备面向对象、并发、安全和健壮性等特点。 Java语言广泛应用于企业级应用、移动应用、桌面应用、游戏开发、云计算和物联网等领域。它的语法结构清晰,易于学习和使用,同时提供了丰富的API库,支持多种编程范式,包括面向对象、命令式、函数式和并发编程。Java的强类型系统和自动内存管理减少了程序错误和内存泄漏的风险。随着Java的不断更新和发展,它已经成为一个成熟的生态系统,拥有庞大的开发者社区和持续的技术创新。Java 8引入了Lambda表达式,进一步简化了并发编程和函数式编程的实现。Java 9及以后的版本继续在模块化、性能和安全性方面进行改进,确保Java语言能够适应不断变化的技术需求和市场趋势。 MySQL是一个关系型数据库管理系统(RDBMS),它基于结构化查询语言(SQL)来管理和存储数据。MySQL由瑞典MySQL AB公司开发,并于2008年被Sun Microsystems收购,随后在2010年,Oracle公司收购了Sun Microsystems,从而获得了MySQL的所有权。MySQL以其高性能、可靠性和易用性而闻名,它提供了多种特性来满足不同规模应用程序的需求。作为一个开源解决方案,MySQL拥有一个活跃的社区,不断为其发展和改进做出贡献。它的多线程功能允许同时处理多个查询,而其优化器则可以高效地执行复杂的查询操作。 随着互联网和Web应用的快速发展,MySQL已成为许多开发者和公司的首选数据库之一。它的可扩展性和灵活性使其能够处理从小规模应用到大规模企业级应用的各种需求。通过各种存储引擎,MySQL能够适应不同的数据存储和检索需求,从而为用户提供了高度的定制性和性能优化的可能性。
springboot606基于Web的就业管理系统-w3209.zip
springboot606基于Web的就业管理系统_w3209.zip
springboot606基于Web的就业管理系统_w3209.zip
java+vue+springboot源代码+数据库+配套文档+答辩教程
springboot606基于Web的就业管理系统_w3209(文档+源码)_kaic.zip
计算机毕业设计


分析与设计
