.NET 業(yè)務(wù)框架開發(fā)實(shí)戰(zhàn)之四 中篇—— DAL的重構(gòu)
前言:
其實(shí)這個(gè)系列還是之前的".NET 分布式架構(gòu)開發(fā)實(shí)戰(zhàn) ",之所以改了名字,主要是因?yàn)槲恼碌臉?biāo)題帶來了不少的歧義:系列文章中本打算開發(fā)一個(gè)簡(jiǎn)化業(yè)務(wù)發(fā)的流程的Framework,然后用這個(gè)Framework再來實(shí)戰(zhàn),開發(fā)一個(gè)分布式的應(yīng)用。改了名字。給大家?guī)砹瞬槐,敬?qǐng)見諒。
本篇的議題如下:
1. 確定DAL的接口的定義。
之前在開發(fā)DAL中,提出了一些思想,也設(shè)計(jì)了一些接口。現(xiàn)在就把DAL的一些設(shè)計(jì)完善起來。說是“完善”,并不是說把所有的代碼都實(shí)現(xiàn),而是把該定義的接口,方法敲定下來。Richard認(rèn)為,設(shè)計(jì)一個(gè)架構(gòu)或者Framework的時(shí)候,開始是接口的定義,定義好各層之間交互的接口,然后才是具體代碼的實(shí)現(xiàn)。
因?yàn)樵谠O(shè)計(jì)Framework的時(shí)候,首先要考慮這個(gè)Framework的使用者是誰,希望他們?cè)趺礃觼硎褂瞄_發(fā)出來的這個(gè)Framework。在這里,Richard很明白:Framework的使用者就是自己公司里的開發(fā)人員。而且還要使得開發(fā)的使用盡量的方便,不要到處去配置一些文檔,最好就是把Framework引入進(jìn)來,稍微配一下就使用。
在Richard設(shè)計(jì)的Framework中,就DAL而言,如果希望DAL返回DataTable,DataReader等給BLL,那么需要配置的僅僅只是指明數(shù)據(jù)庫(kù)的連接字符串;如果希望DAL返回的數(shù)據(jù)實(shí)體給BLL,那么就得把一張張的表映射成為實(shí)體,然后讓這些實(shí)體繼IDataEntity接口就行了(生成實(shí)體可以用ORM工具,或者自己手寫代碼)。 Richard思考了之前對(duì)DAL的設(shè)計(jì),在此他做了一些改進(jìn)。
首先就是對(duì)于IDataContext的重新設(shè)計(jì)和理解:之前的設(shè)計(jì)是定義了IDataContext,然后用不同的方式實(shí)現(xiàn)這個(gè)接口,如LinqDataContext.Provider就是用Linq的方法來返回結(jié)果(DataResult),F(xiàn)在Richard認(rèn)為IDataContext其實(shí)就是用來操作數(shù)據(jù)庫(kù)的,所以返回的結(jié)果就應(yīng)該是操作數(shù)據(jù)之后的結(jié)果,如Update操作就返回受影響的行數(shù)或者是否更新成功。至于是否要把一些額外的信息包裝返回給BLL,就不是IDataContext的實(shí)現(xiàn)者的事情了。而且Richard還考慮到了需要在一定程度上支持原生的ADO.NET,起碼給ADO.NET預(yù)留接口。
基于此,Richard就把IDataContext定義為一個(gè)接口聲明,然后再定義了IDataEntityContext,和IDataTableContext來繼承IDataContext,他們的關(guān)系圖如下:
其中IDataEntityContext使用Linq和Entity Framework來實(shí)現(xiàn),而IDataTableContext就是用ADO.NET的方式來實(shí)現(xiàn)。
IDataEntityContext接口的和系列文章中定義的一些方法差不多,但是做了修改。其中有一點(diǎn)要提的就是:ICriteria就是所有條件對(duì)象要實(shí)現(xiàn)的接口(查詢對(duì)象也是條件對(duì)象的一種)。例如,可以根據(jù)相應(yīng)的條件刪除,更新數(shù)據(jù)。
代碼
/// <summary> /// 所有的數(shù)據(jù)實(shí)體執(zhí)行者實(shí)現(xiàn)這個(gè)借口 /// </summary> public interface IDataEntityContext:IDataContext { TEntity Add<TEntity>(TEntity entity) where TEntity : IDataEntity; List<TEntity> Add<TEntity>(List<TEntity> entityList) where TEntity : IDataEntity; bool Update<TEntity>(TEntity entity) where TEntity : IDataEntity; bool Update<TEntity>(List<TEntity> entityList) where TEntity : IDataEntity; bool Update(ICriteria condiftion, object value); bool Delete<TEntity>(TEntity entity) where TEntity : IDataEntity; bool Delete<TEntity>(List<TEntity> entityList) where TEntity : IDataEntity; bool Delete(ICriteria condition); int GetCount(ICriteria condition); List<TEntity> Query<TEntity>(ICriteria condition); List<TEntity> Query<TEntity>(ICriteria condition, int pageIndex, int pageSize, ref int entityCount) where TEntity : IDataEntity; List<object> Query(ICriteria condiftion); }
出處:
責(zé)任編輯:bluehearts
上一頁(yè) 下一頁(yè) .NET分布式架構(gòu)開發(fā)實(shí)戰(zhàn)(四) 中篇 [2]
◎進(jìn)入論壇網(wǎng)絡(luò)編程版塊參加討論
|