BOS生成代码的说明
在BOS中可以为一个实体定义业务方法,其中业务方法分为两种一种为系统方法,一种为用户自定义方法。BOS在生成这些代码是采用Template Method Pattern,会为每个业务方法生成两个方法,在一般情况下用户只应该实现或者覆盖实现相关的抽象方法。在BOS定义的方法中约定:用户只能实现或覆盖实现前缀为_的方法。
系统方法
系统方法是不可修改的,如果用户修改了名称、参数或者为这个方法添加一个例外,那么BOS将认为这个方法是用户自定义方法,而不是系统方法。 BOS V31提供的系统方法一共有11个,如下:
public boolean exists(Context ctx,IObjectPK pk )throws BOSException ,RemoteException;
public AccountInfo getValue(Context ctx,IObjectPK pk )throws BOSException ,RemoteException;
public AccountInfo getValue(Context ctx,IObjectPK pk ,SelectorItemCollection selector )throws BOSException ,RemoteException;
public IObjectPK addnew(Context ctx,AccountInfo model )throws BOSException ,RemoteException;
public void addnew(Context ctx,IObjectPK pk ,AccountInfo model )throws BOSException ,RemoteException;
public void update(Context ctx,IObjectPK pk ,AccountInfo model )throws BOSException ,RemoteException;
public void delete(Context ctx,IObjectPK pk )throws BOSException ,RemoteException;
public IObjectPK[] getPKList(Context ctx)throws BOSException ,RemoteException;
public IObjectPK[] getPKList(Context ctx,FilterInfo filter ,SorterItemCollection sorter )throws BOSException ,RemoteException;
public AccountCollection getCollection(Context ctx)throws BOSException ,RemoteException;
public AccountCollection getCollection (Context ctx,EntityViewInfo view ) throws BOSException ,RemoteException;
系统方法生成规则
在BOS中,自动生成的系统方法都为强类型,但是由于在实体有继承情况下,getValue和getCollection方法如果生成强类型将编译不过,所以BOS在生成这两个方法是按照如下规则:
最顶层超类,这两个方法名不变叫getValue和getCollection.
子类中这覆盖实现这两个方法,方法名分别叫
getXXXValue和getXXXCellection
示例如下图
注意:由于AAACollection,BBBCollection和CCCCollection不是继承关系,所以在BBB类和CCC的实现类里面要做响应的类型转换。BOS为集合类的基类提供了一个cast方法,这样可以将一种集合类型转换为另一种集合类型,如在BBB的实现类里面需要覆盖实现getCollection方法并将BBBCollection转换为AAACollection;同理在CCC的实现类里面需要覆盖实现getBBBCollection,否则用户在方法这些方法时会抛出ClassCastException.示例代码如下,
BBBCollection bbbs =……;
AAACollection aaas = (AAACollection)bbbs.cast(AAACollection.class);
大家可以参考BOS生成的源代码来理解上面这个转换。
模板方法生成规则
在BOS的代码框架中,用户一般只能覆盖(Overwriting)实现_xxx方法,而不能覆盖不带下划线的方法。
模板方法都为弱类型,如果为强类型,那么生成的代码就是Override,而不是Overwrite,这样就违背了我们设计的本意,所以我们生成的模板方法都为弱类型。
BOS默认为系统方法的模板方法生成调用底层O/R Maping的代码,用户模板方法默认为空实现。不论是系统方法,还是用户方法如果是覆盖实现父类的方法,生成的调用代码都是调用父类的方法,下面是两个示例:
public IObjectPK addnew(Context ctx,AccountInfo model )throws BOSException
{
ServiceContext svcCtx = createServiceContext(new MetaDataPK("9c96887e-00f9-1000-e000-0010c0a8134b"),new Object[]{ctx,model});
invokeServiceBefore(svcCtx);
IObjectPK retValue = (IObjectPK)_addnew(ctx,model);
invokeServiceAfter(svcCtx);
return retValue;
}
protected IObjectPK _addnew(Context ctx,IObjectValue model )throws BOSException
{
return innerAddnew(ctx,model); //调用超类里面的O/R Mapping 实现
}
//update覆盖实现了父类的update方法
public void update(Context ctx,IObjectPK pk ,AccountInfo model )throws BOSException
{
ServiceContext svcCtx = createServiceContext(new MetaDataPK("9c96887e-00f9-1000-e000-0012c0a8134b"),new Object[]{ctx,pk,model});
invokeServiceBefore(svcCtx);
_update(ctx,pk,model);
invokeServiceAfter(svcCtx);
}
protected void _update(Context ctx,IObjectPK pk ,IObjectValue model )throws BOSException
{
super._update(ctx, pk, model); //调用父类的模板类方法
}
对子类模式的处理
BOS V31 SP2提供了对子类模式的支持,BOS支持normal和abstract两种模式,不支持final。
BOS生成代码的说明
最新推荐文章于 2022-07-12 13:54:38 发布