有一阵子没有写mediar.framework的介绍了,主要是比较忙,但是有一个功能很重要—search,不介绍完感觉到有点遗憾。有人提到没有源代码,如果你有兴趣,请留下EMAIL。如果你得到原代码,请不要传播,此程序仅限于学习。
Search 主要在三个模块涉及,UI,Factory, 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.