MyOAOODB+Framework开发参考.docx
- 文档编号:29524145
- 上传时间:2023-07-24
- 格式:DOCX
- 页数:12
- 大小:88.19KB
MyOAOODB+Framework开发参考.docx
《MyOAOODB+Framework开发参考.docx》由会员分享,可在线阅读,更多相关《MyOAOODB+Framework开发参考.docx(12页珍藏版)》请在冰豆网上搜索。
MyOAOODB+Framework开发参考
MyOA.OODB开发参考
2008年11月1日(农历二〇〇八年十月初四)星期六
对象及对象关系
对象
对象是领域(Domain)中的概念或概念间关系的抽象。
对象关系
对象关系类型有:
继承、关联和组合。
如下图:
A、B和C属同一继承体系,A是B、C的祖先,B、C是A的子孙。
继承体系中的任一对象可以使用Descendant获取子孙对象,使用Ancestor获取祖先对象。
B、D是两个有关联的对象,对象的关联类型有R11(一对一)、R1M(一对多)和RMM(多对多)。
使用类属性Association定义对象的关联,R11和R1M关联类型在多重数为1的对象中定义,RMM关联类型可以按照惯例选择其中一个对象定义。
通常,在两个有关联的对象中,将定义关联关系的对象称为左侧对象,对应的称为右侧对象。
左侧对象使用ER*函数(ERCount、ERList、ERLoad和ERView)可以对右侧对象进行计数、加载、列举和视图等操作,右侧对象可以使用ERNavigate获取左侧对象,不过仅限于R11和R1M关联类型。
F是B、D关联关系的抽象,通过继承AssociationClass定义关联类,继承类的构造函数定义中要以左侧对象类型和右侧对象类型为参数调用基类的构造函数。
E是D的组合对象,在检索对象D时,可以直接使用对象E的属性谓词。
表达式Expression
表达式(Expression)是对象属性谓词或属性谓词的逻辑组合。
定义
应用示例
✓使用类EX的静态方法E构造Expression对象
Expressionexpr=EX.E(Staffer.Meta.Code,EX.LEFTLIKE,“D”);
✓使用重载符号“+”和逻辑运算(EX.AND,EX.OR和EX.NOT)连接多个表达式
EX.E(Staffer.Meta.Age,EX.GT,35)
+EX.AND
+EX.E(Staffer.Meta.Sex,EX.EQ,1)
✓使用左右括号更改表达式运算次序
EX.E(Staffer.Meta.Code,EX.LEFTLIKE,“D”)
+EX.AND
+“(“
+EX.E(Staffer.Meta.Age,EX.GT,35)
+EX.AND
+EX.E(Staffer.Meta.Age,EX.LT,60)
+“)“
✓调用Add*方法组合表达式
AddAndExpression,添加表达式,同时将参数表达式与当前表达式进行AND运算
expr.AddAndExpression(EX.E(Staffer.Meta.Age,EX.GT,35));
AddOrExpression,添加表达式,同时将参数表达式与当前表达式进行OR运算
expr.AddOrExpression(EX.E(Staffer.Meta.Age,EX.GT,35));
核心接口IObjectStorage
IObjectStorage是MyOA.OODB的核心接口,所有对象的存储、检索或关系运算都是通过该接口实现的。
对象存储
Save//保存对象
Delete//删除对象
Empty//清空对象
Update//更新对象
对象检索
Count//统计对象数量
List//获取对象列表
Load//获取单个对象
View//分页获取对象
对象关系
Link//建立关系
Unlink//解除关系
Descendant//获取对象子孙
Ancestor//获取对象祖先
ERCount//由左侧对象统计右侧对象数量
ERList//由左侧对象获取右侧对象列表
ERLoad//由左侧对象加载右侧对象
ERView//由左侧对象分页获取右侧对象
ERNavigate//由右侧对象获取左侧对象
ERAssociation//由左侧和右侧对象实例获取关联对象
聚集运算
Avg//平均值
Sum//累加和
Max//最大值
Min//最小值
应用示例
✓使用工厂类DBFactory的CreateDA获取IObjectStorage接口
DBFactory.CreateDA().Save(staffer);
✓使用Field对象限定对象属性
DBFactory.CreateDA().List
列举所有的Staffer对象,在返回的对象中仅包括属性Code,其它属性为默认值。
DBFactory.CreateDA().List
EX.F(Staffer.Meta.Code,Staffer.Meta.Name));
列举所有的Staffer对象,在返回的对象中排除属性Code和Name的读取,即Code和Name采取默认值。
DBFactory.CreateDA().Update
将对象staffer的salary属性更新为2000,其它属性值保持不变。
事务IMyOATransaction
IMyOATransaction是底层数据库事务的面向对象的封装,同数据库事务一样也具备ACID属性,即:
原子性、一致性、隔离性和持久性。
应用示例
using(IMyOATransactiontrans=DBFactory.CreateDBTransaction())
{
try
{
//对象操作
//提交事务
mit();
}
catch
{
//回滚事务
trans.rollback();
throw;
}
}
联合查询JoinQuery
当多个对象有关联关系的时候,可以使用JoinQuery类将这些对象组合在一起进行计数、列举和聚集运算,如:
对象A-B-C-D间的关联关系依次为一对多,多对多和一对多,如果要检索对象C,并且对象C的约束条件分布在A,C和D中,则可以按如下方式检索:
List
using(JoinQueryjq=newJoinQuery(typeof(A),typeof(B),typeof(C),typeof(D)))
{
//将对象C的约束条件转换为由A,B,C和D的表达式组合的表达式对象expr
ls=jq.List
}
JoinQuery支持如下操作:
Count//统计对象数目
Load//加载组合对象中的任一对象
List//列举组合对象中的任一对象
View//分页列举组合对象中任一对象
Aggregation//对组合对象中的任一对象的指定属性进行聚集运算
对象设计
对象设计流程:
MyOA.WEB开发参考
泛型类ObjectInstance
Web页面类是无状态的,使用泛型类ObjectInstance
ObjectInstance
1、定义成员变量
ObjectInstance
2、重写页面的Initialize方法,在该方法中定义staffer的LoadObject委托过程
overridevoidInitialize()
{
staffer.LoadObject=delegate()
{
Expressionexpr=EX.E(Staffer.Meta.Guid,EX.EQ,Request.QueryString[“guid”]);
returnDBFactory.CreateDA().Load
};
}
3、在页面元素或方法中使用staffer.Instance引用Staffer对象
ObjectView
MyOA.WEB将Web页面抽象为ObjectView和RowsetView的容器。
一个WEB页面可以包含多个ObjectView或RowsetView。
ObjectView
///
///
///
publicvoidUpdate()
{
if(this.LoadObject!
=null)
obj=this.LoadObject();
Dictionary
if(this.DefineDataExchangeMap!
=null)
this.DefineDataExchangeMap(map);
page.ToPage(obj,map);
if(this.OnToPage!
=null)
this.OnToPage(obj);
}
ObjectView
///
///
///
publicboolSaveData()
{
if(this.OnValidateUserInput!
=null)
if(!
this.OnValidateUserInput())returnfalse;
if(this.LoadObject!
=null)
obj=this.LoadObject();
try
{
Dictionary
if(this.DefineDataExchangeMap!
=null)
this.DefineDataExchangeMap(map);
page.FromPage(obj,map);
if(this.OnFromPage!
=null)
this.OnFromPage(obj);
if(this.SaveObject!
=null)
this.SaveObject(obj);
else
DBFactory.CreateDA().Save(obj);
returntrue;
}
catch(Exceptionex)
{
page.PublishException(ex);
returnfalse;
}
}
RowsetView
///
///
///
publicvoidUpdate()
{
//验证view是否有DataSource属性
PropertyInfopinfo=view.GetType().GetProperty("DataSource");
if(pinfo==null)
thrownewException(string.Format("类{0}没有DataSource属性!
"));
//显示数据
IList
if(this.navigator!
=null)
{
//获取记录总数
intrecordCount=0;
if(GetRecordCount!
=null)
recordCount=GetRecordCount();
navigator.RecordCount=recordCount;
//获取数据源
if(GetDataSource!
=null)
{
intviewIndex=1;
intviewLength=navigator.ViewLength;
ds=this.GetDataSource(viewIndex,viewLength);
}
}
else
{
if(GetDataSource!
=null)
ds=this.GetDataSource(0,0);
}
//设置对象的DataSource,调用对象的DataBind方法
if(ds!
=null)
{
pinfo.SetValue(view,ds,null);
MethodInfominfo=view.GetType().GetMethod("DataBind");
minfo.Invoke(view,null);
}
//列表数据呈现后的过程
if(this.OnRender!
=null)
this.OnRender();
}
callpage
使用callpage可以在页面中使用JS代码调用页面类函数。
1、页面代码
functionfunc1
{
callpage(“calculate”,function(r){
If(r.length>0)
window.alert(r);
});
}
2、页面函数
在页面类中重载JSFunction,实现callpage的调用过程。
overridestringJSFunction(stringarg)
{
string[]vs=arg.split(‘‘);
if(vs=”calculate”)
return“Thecountis120”;
returnstring.Empty;
}
ExecuteJavaScript
使用ExecuteJavaScript可以在页面的方法返回前,直接添加JS代码,该代码会在客户端加载页面成功后执行。
如:
publicvoidsave(objectsender,CommandEvente)
{
//保存业务逻辑
//添加JS代码
ExecuteJavaScript(“window.alert(‘保存成功!
’)”);
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MyOAOODB Framework 开发 参考