NET 業(yè)務(wù)框架開發(fā)實(shí)戰(zhàn)之四 中篇—— 業(yè)務(wù)層初步構(gòu)想
前言:
本篇主要講述如何把DAL和BLL銜接起來。
本篇議題如下:
1).DAL和BLL之前的Mapping
2).如何Mapping
3).再次構(gòu)思
1.DAL和BLL之前的Mapping
首先,業(yè)務(wù)類和數(shù)據(jù)實(shí)體類不是一 一對應(yīng)的關(guān)系,換句話說,不是一個業(yè)務(wù)類就一定對應(yīng)數(shù)據(jù)庫中的一張表。業(yè)務(wù)類是用只是使用數(shù)據(jù)實(shí)體中的數(shù)據(jù)而已,所以一個業(yè)務(wù)類中的數(shù)據(jù)往往來自多個數(shù)據(jù)實(shí)體。
每個業(yè)務(wù)類都是有自己的一些屬性的,把數(shù)據(jù)以數(shù)據(jù)實(shí)體或者DataTable的形式從DAL獲取之后,BLL類就使用這些數(shù)據(jù),BLL不會把這些原生的數(shù)據(jù)實(shí)體暴露給UI。BLL類會把UI中要是用的數(shù)據(jù)裝入到自己的屬性中。
所以在這個過程中就有一個賦值的過程,或者稱為mapping映射。當(dāng)Richard提出這個想法后,項(xiàng)目組的同事就問他:為什么要做的這么復(fù)雜,還要一 一 的賦值,為什么不直接把數(shù)據(jù)實(shí)體給UI使用,為什么一定要在中間這么轉(zhuǎn)一下呢?
Richard分析了一些原因:
1. 如果直接把數(shù)據(jù)實(shí)體給了UI,那么UI那端就很清楚DAL了,以后數(shù)據(jù)訪問方式從ADO.NET 到了EF,那么UI 就動了,又回到以前了。
2.在BLL中可以對從DAL取出來的數(shù)據(jù)進(jìn)行一些處理,如轉(zhuǎn)換格式,計算,組合等。
Richard想到把BLL和DAL徹底的解耦:業(yè)務(wù)類中不存在數(shù)據(jù)實(shí)體類的引用。這樣設(shè)計之后靈活性就很大了。最后達(dá)到的效果就是:通過配置,配置業(yè)務(wù)類每個屬性的數(shù)據(jù)的來源。而這個業(yè)務(wù)類完全不知道這些數(shù)據(jù)到底來源于哪個或者哪些數(shù)據(jù)實(shí)體。
這樣確實(shí)很靈活,Richard興奮不已。
2. 如何Mapping
初步想法通過配置文件。如現(xiàn)在有一個Product的業(yè)務(wù)類,定義如下:
代碼
public class ProductBL { public string ProductName { get; set; } public decimal Price { get; set; } public string Description { get; set; } }
那么如何給這些屬性賦值,同時也不引用數(shù)據(jù)實(shí)體。Richard用配置文件來實(shí)現(xiàn)的,這里Richard就約定了:配置文件的名字就是“業(yè)務(wù)類的名字”+“Mapping.xml”.所以Product的配置文件就是ProductBLMapping.xml
代碼
<?xml version="1.0" encoding="utf-8" ?> <BusinessModel name="ProductBL" mappingTo="DAL.ProductEntity" > <property name="ProductName" mappingTo="Name" type="System.String"/> <property name="Price" mappingTo="Price" type="System.Decimal"/> <property name="Description" mappingTo="Description" type="System.String"/> </BusinessModel>
然后再運(yùn)行的時候就通過反射來賦值。
現(xiàn)在問題又來了:
1).每次都是通過反射來賦值,性能很成問題。
2).如果配置文件出錯,調(diào)試很不方便。
3).如何處理一個業(yè)務(wù)類對應(yīng)對個數(shù)據(jù)實(shí)體的情況,如:
代碼
public class ProductBL { public string ProductName { get; set; } public decimal Price { get; set; } public string Description { get; set; } //來自CustomDAL public string CustomerName { get; set; } }
但是好處很明顯:
1).DAL和BLL解耦
2).很便于查詢對象的實(shí)現(xiàn)。例如:在UI代碼寫:
ICriteria condition=CriteriaFactory.Create(typeof(ProductBL).Where("ProductName", Operation.Equal,"book");
當(dāng)然ProductName是業(yè)務(wù)類ProductBL的屬性,在查詢對象最后解析為SQL語句的時候就可以利用ProductBLMapping.xml來生成SQL。
(注:小洋請大家想想,上面的思想來自于.NET中哪個開源框架?)
對于性能方面,Richard嘗試這樣解決:
在第一次Mapping的時候,就把這些mapping的信息保存在靜態(tài)字典中,下次在mapping的時候,就不用再讀配置文件了,而且讀內(nèi)存中的字典。
但是這樣,隨著業(yè)務(wù)類的增加,內(nèi)存使用也加大,而且賦值方式還是反射。
3. 再次構(gòu)思
Richard接著考慮:如何處理一個業(yè)務(wù)類對應(yīng)對個數(shù)據(jù)實(shí)體的情況?于是配置文件就改為了:
代碼
<?xml version="1.0" encoding="utf-8" ?> <BusinessModel name="ProductBL" > <property name="ProductName" mappingTo="DAL.ProductEntityName" type="System.String"/> <property name="Price" mappingTo="DAL.ProductEntityPrice" type="System.Decimal"/> <property name="Description" mappingTo="DAL.ProductEntityDescription" type="System.String"/> <property name="CustomerName" mappingTo="DAL.CustomerEntity.Name" type="System.String"/> </BusinessModel>
基本的問題算是解決了,但是性能的問題依然存在。
Richard又開始考慮更加好的方式。
本篇就寫到這里,謝謝各位。
下篇: .NET 業(yè)務(wù)框架開發(fā)實(shí)戰(zhàn)之八 業(yè)務(wù)層Mapping的選擇策略版
權(quán)為小洋和博客園所有,轉(zhuǎn)載請標(biāo)明出處給作者。
http://www.cnblogs.com/yanyangtian
原文:
http://www.cnblogs.com/yanyangtian/archive/2010/06/07/1752921.html
出處:博客園
責(zé)任編輯:bluehearts
上一頁 下一頁 .NET業(yè)務(wù)框架開發(fā)實(shí)戰(zhàn)之四 后篇 [2]
◎進(jìn)入論壇網(wǎng)絡(luò)編程版塊參加討論
|