OOM(对象与对象映射)场景设计和实现原理

简介:
在前文有一篇随笔,写了关于《UI与实体的映射》,有朋友建议写一下实现原理。今天我就整理一下,将OO映射的使用场景设计和实现原理描述一下。原来的实现比较拙劣,如果要发布成产品的话,还需要重构很多地方,以提高组件API的易用性和扩展性。注:该组件是2006年基于DOTNET 1.1实现的,因此没有泛型和其它现在比较时尚的功能。

1 OO映射使用场景设计

OO映射提出的目的是为了解决将UI对象转换成一个ORM中的实体,然后可以利用ORM直接将其持久化,避免一堆的幅值逻辑。先看一下映射类的定义,然后将定义不同的映射场景。所有的映射定义都是在实体类OO映射预定义的映射方式有Member与Member映射,Control与Member映射,Reference映射。同时,也支持自定义扩展。该组件只是一个个人用的,耗时4天完成,因此现有功能非常有限。
ContractedBlock.gif Code

1.1 Member映射场景

(1)UI对象与实体对象Public相同字段直接映射
[Member]
public int Age;
这个在实体类的映射定义指明了如下信息:1)UI类有一个Age字段;2)UI类的Age字段与实体类Age字段映射。
(2)UI对象字段的属性与实体直接映射
[Member("AgeObject.MyAge")]
public int Age;
该映射定义了实体类的Age将与UI类的AgeObject对象的MyAge字段/属性映射。属性可以串成一个路径方式,比如ObjectA.PropA1.PropA11.PropA111。
(3)UI对象与实体对象Public相同字段直接映射
[Member]
public bool Sex
{
set;
get;
}
定义实体类的Sex属性与UI的Sex字段/属性映射。
(4)UI对象字段的属性与实体直接映射
[Member("SexObject.MySex")]
public bool Sex
{
set;
get;
}
定义实体类Sex属性与UI类的SexObject类实例成员的Sex成员映射。

1.2 控件映射场景

UI类中控件与Member定义方式是一模一样的,只不过控件是一个比较特殊的Member。在OO映射组件里,每一个控件都有默认属性,在配置文件中定义。
以下是默认的定义。
ContractedBlock.gif Code

以下说明控件映射的场景。
(1)控件默认属性与成员映射
[Control]
public string Name
{
set;
get;
}
定义了UI类的Name控件的默认属性与实体类Name属性映射。如果Name控件是一个TextBox,那么其默认属性是Text。
(2)控件指定属性路径与成员映射
[Control("Name.Text")]
public string Name
{
set;
get;
}
实现UI类的Name控件的Text属性与实体类Name映射。

1.3 引用映射

引用映射定义一个实体类如果包含另一个实体类,他们都可以直接实现映射。
[Reference(typeof(EmployeeEntity))]
public EmployeeEntity Employee
{
get;
set;
}
该场景定义了实体类中的Employee也是一个支持OO映射的实体。当执行映射时,Employee成员也必须实现映射幅值。

1.4 全局映射定义

全局映射用于指定一个实体类的映射是否为单件模式、UI类与实体类成员命名前后缀差异。它的特性定义是应用于实体类,而不是成员。
/// <summary>
/// 全局映射定义。
/// </summary>
[Map(DeployMode.SingleCall, "<Prefix>", "<Postfix>")]
public class UserEntity

1.5 扩展场景

其它场景我原来没有实现,不过可以进行自定义扩展,比如方法与成员映射,动态更改映射属性等。

2 实现原理

OO映射组件的实现比较简单,核心类实现如下:


ObjectEngine是整个OO映射的入口,它定义了3个静态方法:SetMapper用于设置实现IObjectMapper的对象映射器,默认值为DefaultObjectMapper的实例。
IObjectMapper是实现OO映射的核心定义,它定义了默认的成员映射器和正向映射与反向映射方法。IObjectMapper在实现上将整个实体的映射分解成
每一个成员的映射,使用成员映射器实现每一个成员具体映射。DefaultMapper是IObjectMapper默认实现,它依赖与成员映射器工厂和实体类型描述缓存。
其实现如下:
ContractedBlock.gif Code

IMemberMapper是实现实体成员映射的核心定义,它定义了与成员映射器对应的映射特性类型和正向映射与反向映射方法。目前有3个默认实现,分别是:MemberMapper、ControlMapper和ReferenceMapper,它们分别对应MemberAttribute、ControlAttribute和ReferenceAttribute特性。
MemberMapper的实现如下:
ContractedBlock.gif Code

ControlMapper的实现如下:
ContractedBlock.gif Code

ReferenceMapper的实现如下:
ContractedBlock.gif Code

 


本文转自道法自然博客园博客,原文链接:http://www.cnblogs.com/baihmpgy/archive/2009/09/06/1561224.html,如需转载请自行联系原作者


目录
相关文章
|
存储 安全 算法
深入剖析JVM内存管理与对象创建原理
JVM内存管理,JVM运行时区域,直接内存,对象创建原理。
37 2
|
1月前
|
缓存 Java API
JVM 四种引用和使用场景
在JDK 1.2之后,Java对引用的概念进行了扩充,将引用分为强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(Phantom Reference)四种,Java 4种引用的级别由高到低依次为:强引用 > 软引用 > 弱引用 > 虚引用。
19 0
|
2月前
|
NoSQL API Redis
数据对象的底层实现方式你都了解吗?
上一小节我们提到的五种数据类型其实就是 Redis 的数据对象,我们先来看看数据对象的类型:Redis 的 key 都是 string 类型的,以上各类型说的其实都是 value 的类型,以下是对象的几个优点:
37 0
数据对象的底层实现方式你都了解吗?
|
1月前
|
算法 Oracle Java
【JVM】了解JVM中动态判断对象年龄的原理
【JVM】了解JVM中动态判断对象年龄的原理
23 0
|
3月前
|
Java
JVM new一个对象过程
【1月更文挑战第4天】JVM new一个对象过程
|
8月前
|
存储 Java
|
8月前
|
存储 算法 安全
【jvm系列-06】深入理解对象的实例化、内存布局和访问定位
【jvm系列-06】深入理解对象的实例化、内存布局和访问定位
183 0
【jvm系列-06】深入理解对象的实例化、内存布局和访问定位
|
8月前
|
存储 算法 安全
【jvm系列-10】深入理解jvm垃圾回收器的种类以及内部的执行原理
【jvm系列-10】深入理解jvm垃圾回收器的种类以及内部的执行原理
113 0
为什么说对象是类的一个实例?底层原理是什么?
为什么说对象是类的一个实例?底层原理是什么?
198 0
|
存储 安全 前端开发
【JVM原理探索】你真正掌握了Java对象创建的流程吗?
【JVM原理探索】你真正掌握了Java对象创建的流程吗?
129 0
【JVM原理探索】你真正掌握了Java对象创建的流程吗?