.NET 分布式架構(gòu)開發(fā)實戰(zhàn)之四 構(gòu)建從理想和實現(xiàn)之間的橋梁(前篇)
一般的Add方法都是返回添加是否成功,true或者false,方法再次改造:
bool AddSingleDataEntity<T>(T dataEntity) where T:IDataEntity,class,new();
然后Richard就寫出了上面列出的一些方法的定義:
bool AddSingleDataEntity<T>(T dataEntity) where T : class,IDataEntity, new();
bool AddDataEntityList<T>(List<T> dataEntityList) where T : class,IDataEntity, new();
bool DeleteDataEntityList<T>(List<T> dataEntityList) where T : class,IDataEntity, new();
bool DeleteSingleDataEntity<T>(T dataEntity) where T : class,IDataEntity, new();
bool UpdateSingleDataEntity<T>(T dataEntity) where T : class,IDataEntity, new();
bool UpdateDataEntityList<T>(List<T> dataEntityList) where T : class,IDataEntity, new();
至于GetDataEntityList,按照之前的查詢對象的想法,傳入一個IQuery的接口:
List<T> GetDataEntityList<T>(IQuery query)where T : class,IDataEntity, new();
2. 對基本的操作的進一步的思考
確實,上面那些基本操作是沒有什么問題的,現(xiàn)在Richard又考慮到了另外的一些問題,還是以AddSingleDataEntity方法為例:
a. 有些時候,不僅僅要知道插入數(shù)據(jù)是否成功,而且還想返回新加入數(shù)據(jù)在數(shù)據(jù)庫中的主鍵信息來做其他的用途。怎么辦?再來查詢一次?
b. 如果插入失敗了,僅僅只是返回一個false嗎?可能其他的調(diào)用模塊想知道到底是發(fā)生了什么異常而導(dǎo)致的插入失敗,而且其他的模塊對于發(fā)生的異常有自己的處理方法,所以AddSingleDataEntity要提供足夠的信息。
基于上面的思考,所以這個基本的操作方法不能只是簡單的返回一些簡單的值就完了。也就是說,這些方法要返回一個數(shù)據(jù)包:里面包含很多信息,以便其他的調(diào)用模塊來使用這些信息,感覺有點像是C#事件中的eventArgs.
所以Richard在Common的那個類庫中加入一個對象,定義如下:
代碼
public class DataResult<T> where T : IDataEntity { public List<T> EntityList { get; set; } public bool IsSuccess { get; set; } public Exception Exception { get; set; } public object CustomData { get; set; } }
這個類最后將會作為方法的返回結(jié)果。
Richard發(fā)覺,上面的方法確實是很有”自解釋性”,但是很多的開發(fā)人員對這些CRUD操作的名字都很熟悉了,而且最后開發(fā)的出來的架構(gòu)的使用者還是開發(fā)人員,應(yīng)該符合他們的習(xí)慣,所以Richard改變了方法的名字,改變后的版本如下:
代碼
public interface IDataContext { IList<T> Query<T>(IQuery queryCondition) where T : class,IDataEntity, new(); IList<T> Query<T>(IQuery queryCondition, int pageIndex, int pageCount) where T : class,IDataEntity, new(); // CRUD services (well, mostly CUD) T Add<T>(T item) where T : class,IDataEntity, new(); IList<T> Add<T>(List<T> itemList) where T : class,IDataEntity, new(); bool Delete<T>(List<T> itemList) where T : class,IDataEntity, new(); bool Delete<T>(T item) where T : class,IDataEntity, new(); T Update<T>(T item) where T : class,IDataEntity, new(); List<T> Update<T>(List<T> itemList) where T : class,IDataEntity, new(); }
3. 查詢對象的一些思考
在上面的基本的操作中,在Query方法中傳入的是查詢對象,因為查詢對象是基于解釋器的,可以在解釋完查詢對象之后就緩存起來。以后再次查詢的時候,如果兩個查詢的對象一樣(例如在構(gòu)造查詢對象時候,可以為其定義一個唯一的標示),那么就不用再去對查詢對象進行解釋。如果根據(jù)這個查詢對象的查出的數(shù)據(jù)都是只讀的,那就更好了,就可以把查詢對象和對應(yīng)的結(jié)果一起緩存起來。
今天就先寫到這里了,下一篇:
.NET 分布式架構(gòu)開發(fā)實戰(zhàn)之四 構(gòu)建從理想和實現(xiàn)之間的橋梁(中篇)—DAL的基本方法的重構(gòu)
謝謝各位!
轉(zhuǎn)載:http://www.cnblogs.com/yanyangtian/archive/2010/05/28/1746334.html
本文鏈接:http://m.95time.cn/tech/program/2010/7755.asp
出處:博客園
責任編輯:bluehearts
上一頁 .NET分布式架構(gòu)開發(fā)實戰(zhàn)(四) 前篇 [1] 下一頁
◎進入論壇網(wǎng)絡(luò)編程版塊參加討論
|