AAF灵便应用框架简介系列(3):对象模型

aafshzj 2006-09-04 11:38:11
AAF对象模型的核心是IAgileObject接口及其实现。所有Business Object在使用AAF时都应直接或间接继承自IAgileObject的基本实现:AgileObject。本文的内容看起来似乎会较多较复杂,但在实际应用中,绝大多数时候都不需要关心这些内容。本文的目的只是为了让大家对AAF的内核模型有所了解,如果大家觉得枯燥可以粗略读一下,有点基本概念即可。下面首先看看IAgileObject接口。

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小坐,看看全文。

...全文
217 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
aafshzj 2006-09-04
  • 打赏
  • 举报
回复
没人关注吗?
aafshzj 2006-09-04
  • 打赏
  • 举报
回复
呵呵,既然NHibernate让你心惊胆战,为什么不用用这个。至少AAF的使用者没人心惊胆战。^_^
JavaDianNet 2006-09-04
  • 打赏
  • 举报
回复
NHIBERNATE用的都心惊胆战哪敢用你的...说实话,没前途...商业用途的话还是趁早打消念头吧...

13,190

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 分析与设计
社区管理员
  • 分析与设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧