有一阵子没有写mediar.framework的介绍了,主要是比较忙,但是有一个功能很重要—search,不介绍完感觉到有点遗憾。有人提到没有源代码,如果你有兴趣,请留下EMAIL。如果你得到原代码,请不要传播,此程序仅限于学习。
Search 主要在三个模块涉及,UI,Factory, DataAccess , Search 需要写的代码比较少,格式比较简单,但是有一个性能的问题,对于搜索的结果,当要显示子对象内容时,子对象会重新去服务器取一次。
UI需要从BizObjectSearch 继承,这样做的好处是,可以统一搜索条件面,统一加入其它的功能 ,比如对结果集进行Excel导出等。从主界面或者其他的界面打开Search 界面需要用这样的代码:
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
SearchAndEdit sae;
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
try
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
sae = new SearchAndEdit(new ContactSearch(), typeof(ContactEdit), "Edit Contact", false);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
catch (Exception ee)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{ }
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
Search 界面收集搜索条件会用到这样一个类Condition , 把所有的条件放在一个list ,或者Hashtable中,界面中一个条件对应一个值。最后传给调用的对应的工厂类。另外search 基类还提供设置初使值的方法。
工厂类主要职责是把条件传递给数据访问层,从数据访问层得到数据后再转换为对应的集合,最后传递给界面。搜索对应的工厂类比较简单,对应的代码类似
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
public ContactCollection Search(List<Condition> con)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
ContactDataAccess da = GetDataAccess() as ContactDataAccess;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
DataSet ds = da.Search(con);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
ContactCollection bo = BuildBizObjectCollection(ds, QueryFor.Complete) as ContactCollection;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
return bo;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
这里BuildBizObjectCollection 方法是把表转成对象集合
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
protected virtual BizObjectCollection BuildBizObjectCollection(DataSet ds, QueryFor queryFor)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Guid id;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
BizObject bo;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
DataTable dt;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
BizObjectCollection bocol;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
bool cacheChildCol;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
this.CacheChildRows(ds, queryFor);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
cacheChildCol = this.ContainsChildCollection(ds, queryFor);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
dt = ds.Tables[mDataObjectTableName];
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
bocol = CreateBizObjectCollection();
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
foreach (DataRow dr in dt.Rows)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
id = new Guid(dr["UniqueID"].ToString());//((Guid)());
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
bo = null;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
if ((cacheChildCol))
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
this.CacheChildCollections(ds, id, queryFor);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
if ((mBizObject.ContainsKey(id) && mBizObject[id] is BizObject))
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
bo = ((BizObject)(mBizObject[id]));
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
bo.Refresh(dr, false);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
else
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
bo = CreateBizObject(dr);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
bocol.Add(bo);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
bocol.FinishedLoad();
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
return bocol;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
方法中添加了cache, CreateBizObject方法是每行对应一个实体。
public BizObject CreateBizObject(DataRow dr)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
BizObject bo;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
bo = CreateBizObject(this, dr);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
UpdateCache(bo);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
return bo;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
CreateBizObject(this, dr)是一个抽象方法,在每个实体类中实现;最后调用类的构造方法,通过类里MoveRowToProperties(System.Data.DataRow dr)方法最终实数据行到实体的转换。
数据访问层主要是取得SQL,和参数,调用基类中其他访问数据的工具,返回所需要的数据。SQL语句一般可根据生成工具生成,如果是多表联合查询复杂的语句则需要手工写。目前数据访问工具使用了微软企业类库。
在数据访问层中有一个很重要,就是前面提到的DbCondition 这个类主要解析在UI中传入的条件,并生成对应的参数。现在支持Oracle ,MSSQl.