Mediar.framework--Search 功能

有一阵子没有写mediar.framework的介绍了,主要是比较忙,但是有一个功能很重要—search,不介绍完感觉到有点遗憾。有人提到没有源代码,如果你有兴趣,请留下EMAIL。如果你得到原代码,请不要传播,此程序仅限于学习。

 

Search 主要在三个模块涉及,UI,Factory, DataAccess , Search 需要写的代码比较少,格式比较简单,但是有一个性能的问题,对于搜索的结果,当要显示子对象内容时,子对象会重新去服务器取一次。

UI需要从BizObjectSearch 继承,这样做的好处是,可以统一搜索条件面,统一加入其它的功能 ,比如对结果集进行Excel导出等。从主界面或者其他的界面打开Search 界面需要用这样的代码:

ContractedBlock.gif ExpandedBlockStart.gif
None.gif  SearchAndEdit sae;
None.gif
None.gif            
try
None.gif
ExpandedBlockStart.gifContractedBlock.gif            
dot.gif{
InBlock.gif
InBlock.gif                sae 
= new SearchAndEdit(new ContactSearch(), typeof(ContactEdit), "Edit Contact"false);
InBlock.gif
ExpandedBlockEnd.gif            }

None.gif
None.gif            
catch (Exception ee)
None.gif
ExpandedBlockStart.gifContractedBlock.gif            
dot.gif{    }
None.gif

Search 界面收集搜索条件会用到这样一个类Condition , 把所有的条件放在一个list ,或者Hashtable中,界面中一个条件对应一个值。最后传给调用的对应的工厂类。另外search 基类还提供设置初使值的方法。

   工厂类主要职责是把条件传递给数据访问层,从数据访问层得到数据后再转换为对应的集合,最后传递给界面。搜索对应的工厂类比较简单,对应的代码类似

ContractedBlock.gif ExpandedBlockStart.gif
None.gif public ContactCollection Search(List<Condition> con)
None.gif
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif{
InBlock.gif
InBlock.gif            ContactDataAccess da 
= GetDataAccess() as ContactDataAccess;
InBlock.gif
InBlock.gif            DataSet ds 
= da.Search(con);
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif            ContactCollection bo 
= BuildBizObjectCollection(ds, QueryFor.Complete) as ContactCollection;
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif            
return bo;
InBlock.gif
ExpandedBlockEnd.gif        }

None.gif

这里BuildBizObjectCollection 方法是把表转成对象集合

ContractedBlock.gif ExpandedBlockStart.gif
None.gifprotected virtual BizObjectCollection BuildBizObjectCollection(DataSet ds, QueryFor queryFor)
None.gif
ExpandedBlockStart.gifContractedBlock.gif         
dot.gif{
InBlock.gif
InBlock.gif              Guid id;
InBlock.gif
InBlock.gif              BizObject bo;
InBlock.gif
InBlock.gif              DataTable dt;
InBlock.gif
InBlock.gif     
InBlock.gif
InBlock.gif              BizObjectCollection bocol;
InBlock.gif
InBlock.gif              
bool cacheChildCol;
InBlock.gif
InBlock.gif              
this.CacheChildRows(ds, queryFor);
InBlock.gif
InBlock.gif              cacheChildCol 
= this.ContainsChildCollection(ds, queryFor);
InBlock.gif
InBlock.gif              dt 
= ds.Tables[mDataObjectTableName];
InBlock.gif
InBlock.gif              bocol 
= CreateBizObjectCollection();
InBlock.gif
InBlock.gif              
foreach (DataRow dr in dt.Rows) 
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif              
dot.gif{
InBlock.gif
InBlock.gif                id 
= new Guid(dr["UniqueID"].ToString());//((Guid)());
InBlock.gif

InBlock.gif                
InBlock.gif
InBlock.gif                   bo 
= null;
InBlock.gif
InBlock.gif                   
if ((cacheChildCol)) 
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif                   
dot.gif{
InBlock.gif
InBlock.gif                       
this.CacheChildCollections(ds, id, queryFor);
InBlock.gif
ExpandedSubBlockEnd.gif                   }

InBlock.gif
InBlock.gif                   
if ((mBizObject.ContainsKey(id) && mBizObject[id] is BizObject)) 
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif                   
dot.gif{
InBlock.gif
InBlock.gif                       bo 
= ((BizObject)(mBizObject[id]));
InBlock.gif
InBlock.gif                       bo.Refresh(dr, 
false);
InBlock.gif
ExpandedSubBlockEnd.gif                   }
 
InBlock.gif
InBlock.gif                   
else 
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif                   
dot.gif{
InBlock.gif
InBlock.gif                       bo 
= CreateBizObject(dr);
InBlock.gif
ExpandedSubBlockEnd.gif                   }

InBlock.gif
InBlock.gif                   bocol.Add(bo);
InBlock.gif
ExpandedSubBlockEnd.gif              }

InBlock.gif
InBlock.gif              bocol.FinishedLoad();
InBlock.gif
InBlock.gif              
return bocol;
InBlock.gif
ExpandedBlockEnd.gif         }

None.gif

 

方法中添加了cache, CreateBizObject方法是每行对应一个实体。

None.gif public  BizObject CreateBizObject(DataRow dr)
None.gif
ExpandedBlockStart.gifContractedBlock.gif         
dot.gif {
InBlock.gif
InBlock.gif              BizObject bo;
InBlock.gif
InBlock.gif              bo 
= CreateBizObject(this, dr);
InBlock.gif
InBlock.gif              UpdateCache(bo);
InBlock.gif
InBlock.gif              
return bo;
InBlock.gif
ExpandedBlockEnd.gif         }

None.gif

CreateBizObject(this, dr)是一个抽象方法,在每个实体类中实现;最后调用类的构造方法,通过类里MoveRowToProperties(System.Data.DataRow dr)方法最终实数据行到实体的转换。

 

数据访问层主要是取得SQL,和参数,调用基类中其他访问数据的工具,返回所需要的数据。SQL语句一般可根据生成工具生成,如果是多表联合查询复杂的语句则需要手工写。目前数据访问工具使用了微软企业类库。

在数据访问层中有一个很重要,就是前面提到的DbCondition 这个类主要解析在UI中传入的条件,并生成对应的参数。现在支持Oracle ,MSSQl.

转载于:https://www.cnblogs.com/mediar/archive/2006/11/13/559502.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值