`
trent_luo
  • 浏览: 43872 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

BOS生成代码的说明

阅读更多
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。
 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics