Mediar.framework--Search 功能

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

 

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

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


  SearchAndEdit sae;

            
try

            
{

                sae 
= new SearchAndEdit(new ContactSearch(), typeof(ContactEdit), "Edit Contact"false);

            }


            
catch (Exception ee)

            
{    }

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

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


 public ContactCollection Search(List<Condition> con)

        
{

            ContactDataAccess da 
= GetDataAccess() as ContactDataAccess;

            DataSet ds 
= da.Search(con);

 

            ContactCollection bo 
= BuildBizObjectCollection(ds, QueryFor.Complete) as ContactCollection;

 

            
return bo;

        }

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


protected virtual BizObjectCollection BuildBizObjectCollection(DataSet ds, QueryFor queryFor)

         
{

              Guid id;

              BizObject bo;

              DataTable dt;

     

              BizObjectCollection bocol;

              
bool cacheChildCol;

              
this.CacheChildRows(ds, queryFor);

              cacheChildCol 
= this.ContainsChildCollection(ds, queryFor);

              dt 
= ds.Tables[mDataObjectTableName];

              bocol 
= CreateBizObjectCollection();

              
foreach (DataRow dr in dt.Rows) 

              
{

                id 
= new Guid(dr["UniqueID"].ToString());//((Guid)());

                

                   bo 
= null;

                   
if ((cacheChildCol)) 

                   
{

                       
this.CacheChildCollections(ds, id, queryFor);

                   }


                   
if ((mBizObject.ContainsKey(id) && mBizObject[id] is BizObject)) 

                   
{

                       bo 
= ((BizObject)(mBizObject[id]));

                       bo.Refresh(dr, 
false);

                   }
 

                   
else 

                   
{

                       bo 
= CreateBizObject(dr);

                   }


                   bocol.Add(bo);

              }


              bocol.FinishedLoad();

              
return bocol;

         }

 

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

public  BizObject CreateBizObject(DataRow dr)

         
{

              BizObject bo;

              bo 
= CreateBizObject(this, dr);

              UpdateCache(bo);

              
return bo;

         }

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

 

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

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

你可能感兴趣的:(Mediar.framework--Search 功能)