.NET 分布式架構(gòu)開(kāi)發(fā)實(shí)戰(zhàn)之四 構(gòu)建從理想和實(shí)現(xiàn)之間的橋梁(前篇)
前言:
上一篇文章講述了一些實(shí)現(xiàn)DAL的理論,本篇主要是DAL實(shí)現(xiàn)的的初步的嘗試。
本篇的主要議題如下:
1). 設(shè)計(jì)DAL的基本操作
2). 對(duì)基本的操作的進(jìn)一步的思考
3). 查詢(xún)對(duì)象的一些思考
1. 設(shè)計(jì)DAL的基本操作
Richard認(rèn)為:在設(shè)計(jì)一個(gè)架構(gòu)或者Framework的時(shí)候,有幾點(diǎn)很重要:
a. 總體把握的能力。
b. 抽象的能力。
c. 分析的能力
首先,從總體上來(lái)看,Richard認(rèn)為DAL中最基本,而且最容易想到的方法就是CRUD(Create, Read, Update, Delete)四個(gè)操作。
于是Richard在草紙寫(xiě)出了基本操作的名稱(chēng):
AddSingleDataEntity;
AddDataEntityList;
UpdateSingleDataEntity;
UpdateDataEntityList;
DeleteSingleDataEntity;
DeleteDataEntityList;
GetSingleDataEntiry;
GetDataEntityList;
上面列出的方法名字很長(zhǎng),其實(shí)Richard在思考這些方法的名稱(chēng)的時(shí)候也參考了.NET設(shè)計(jì)規(guī)范中的一些建議:方法名稱(chēng)要具有“自解釋性”,因?yàn)榧軜?gòu)的設(shè)計(jì)最后還是給開(kāi)發(fā)人員用的,所以方法的定義要一眼就看出它是干什么的,而且規(guī)范的命名也可以大大的減少維護(hù)的成本。(可能這些名字的命名有點(diǎn)對(duì)規(guī)范的“生搬硬套”,但是之后會(huì)慢慢的重構(gòu)的)
從總體出發(fā),已經(jīng)定義出了基本的操作,那么現(xiàn)在就開(kāi)始一步步的分析,如何實(shí)現(xiàn)這些方法。
Richard開(kāi)始思考第一個(gè)方法的實(shí)現(xiàn),其實(shí)Richard心里也清楚:其實(shí)到底哪個(gè)方法作為第一個(gè)來(lái)考慮也許很重要,但是在一切都不清楚之前起碼要拿一個(gè)來(lái)入手,而且隨著思考的深入,很多的問(wèn)題都會(huì)慢慢的浮現(xiàn),到時(shí)候一切就會(huì)明晰起來(lái)。
對(duì)于AddSingleDataEntity這個(gè)方法,首先就要考慮這個(gè)方法到底要把什么添加到數(shù)據(jù)庫(kù)中,也就是說(shuō)要考慮這個(gè)方法的參數(shù),而且這個(gè)參數(shù)要足夠的“兼容”,因?yàn)橹癛ichard就是想設(shè)計(jì)出一個(gè)“以不變應(yīng)萬(wàn)變”的DAL。在考慮這個(gè)參數(shù)問(wèn)題之前,首先Richard很清楚:在.NET數(shù)據(jù)訪問(wèn)技術(shù)中,Linq,Entity Framework等ORM技術(shù)已經(jīng)廣泛的應(yīng)用,所以在設(shè)計(jì)DAL的時(shí)候要充分的考慮到現(xiàn)有的一些技術(shù)(盡量避免重新造輪子)。
而且在數(shù)據(jù)是如何被存入到數(shù)據(jù)庫(kù)中的以及數(shù)據(jù)是如何從數(shù)據(jù)庫(kù)中取出的,這個(gè)工作是完全可以交給這些ORM的,最后的結(jié)果就是:在DAL中只是操作這些ORM的那些映射實(shí)體;谶@個(gè)想法, Richard就確定了:AddSingleDataEntity參數(shù)是一個(gè)數(shù)據(jù)實(shí)體。(本系列文章約定:數(shù)據(jù)實(shí)體,即DataEntity,就是ORM對(duì)一個(gè)數(shù)據(jù)庫(kù)表進(jìn)行映射后產(chǎn)生的實(shí)體和數(shù)據(jù)庫(kù)中的表一一對(duì)應(yīng),如在數(shù)據(jù)庫(kù)中有一張Employee表,Linq to Sql將會(huì)把它映射成為Employee的一個(gè)類(lèi),這個(gè)類(lèi)就稱(chēng)為數(shù)據(jù)實(shí)體)。因?yàn)檫@些方法最終是操作數(shù)據(jù)實(shí)體的,所以包含這些方法的接口名字就定義為IDataContext。
因?yàn)椴煌谋懋a(chǎn)生不同的數(shù)據(jù)實(shí)體,但是Richard還想使得AddSingleDataEntity這個(gè)方法可以接受任何的數(shù)據(jù)實(shí)體,所以此時(shí)很有必要對(duì)數(shù)據(jù)實(shí)體進(jìn)行抽象。所以Richard想到了定義一個(gè)接口:IDataEntity,打算讓所有通過(guò)ORM生成的數(shù)據(jù)實(shí)體都繼承這個(gè)接口。而且Richard還想到:
1. 如果BLL直接引用DAL使用的,那么IDataEntity可能會(huì)在BLL中出現(xiàn)的。
2. 如果BLL通過(guò)repository去DAL中獲取數(shù)據(jù),那么到時(shí)候BLL可能都不會(huì)直接引用DAL,但是BLL最終還是得使用數(shù)據(jù)做事情,所以IDataEntity還是會(huì)在BLL中出現(xiàn),所以,IDataEntity接口最好定義在一個(gè)公共的地方。
Richard決定新建一個(gè)Common的類(lèi)庫(kù),加入IDataEntity接口的定義,現(xiàn)在這個(gè)接口里面什么都沒(méi)有,只是一個(gè)標(biāo)記而已,表明繼承這個(gè)接口的類(lèi)就是數(shù)據(jù)實(shí)體類(lèi)。
AddSingleDataEntity(IDataEntity dataEntity);
還有一點(diǎn)就是盡量的使用類(lèi)型安全的方法,于是Richard把方法改成了范型方法:
AddSingleDataEntity<T>(T dataEntity) where T:IDataEntity,class,new();
至于T 的那些約束:T:IDataEntity,class,new(),是考慮到了Linq和EF中對(duì)數(shù)據(jù)實(shí)體的一些要求。
出處:博客園
責(zé)任編輯:bluehearts
上一頁(yè) 下一頁(yè) .NET分布式架構(gòu)開(kāi)發(fā)實(shí)戰(zhàn)(四) 前篇 [2]
◎進(jìn)入論壇網(wǎng)絡(luò)編程版塊參加討論
|