由簡單三層到工廠模式
以ASP.NET為例,簡單三層就是 DAL, BLL,Model 三層構成, DAL層處理資料,負責與資料打交道,比如SQL語句的書寫等,DAL層處理完資料後的結果,交由BLL層,BLL層這時對資料進行邏輯整理。具體如下詳細說明:
現有一個簡單的需求,一個訂單裡可能包含幾個產品,這時,我們一般這樣處理,把訂單寫在主表,把具體的詳細商品寫在訂單詳細表,詳細表中有一個主表的ID,用於關聯二表。當用戶下單提交時,處理如下:
兩個表設為 主表Orders, 副表 OrderItem
DAL層:寫SQL語句,分別寫兩個方法,一個是插入主表的方法,另一個是插入副表的方法。
插入主表Orders
public long Add(ModelOrder model) { …… }
插入副表OrderItem,語句這裡略掉,這裡只說明思路,不做真實的資料。
public long Add(ModelOrderItem model)
{
……
}
這兩個方法,首先執行第一個返回的ID,然後第二個方法要用到這個返回的ID,那麼這個邏輯處理就在BLL層裡來處理了,這樣寫:
//插入主表後返回的ID
long id = DAL.Add(model);
//如果執行成功,說明ID>0
if(id>0)
{
DAL.Add(model);
}
這個方法執行完,再返回到頁面層級結果。
注意:其實上面的業務層處理嚴格的說寫的不正確,為什麼呢?設想我們插入主表成功了,但返回ID後,插入副表的時候,出錯了,沒有插入,那麼就會造成資料庫裡只儲存了訂單資訊,但沒有訂單詳情資訊。如何解決呢?自然我們會想到了事務,一旦出現上述情況,使用事務時,資料庫會回滾,就是第二步出錯了,那麼第一步也會撤消。
using (SqlTransaction transaction = connection.BeginTransaction()){}
當然,這就個就要寫在DAL層裡了,在DAL層裡把各個的新增方法寫好了,然後在寫一個方法,這個方法就是把各個方法加到事務中去,如果有一條語句執行時出錯,則事務回滾,等於沒有操作。
這基本上是一個簡單三層的形象的最簡單的介紹,那麼簡單三層有時候不能滿足我們需要,比如說,你是一家軟體公司,那麼你開發了一個軟體,用的SQLServer,而剛好碰到一個客戶需要使用oracle,或是mysql,怎麼辦?當然,你也可以改,但是改的東西多了,最起碼整個資料層都要被你扒了一遍了,而有一種方法基本不用怎麼修改就可以達到需求,那就是工廠模式。
簡單介紹:使用工廠模式,面向介面的程式設計,把資料層和業務層使用介面來交接,面向介面,不面向具體的實現,只要操作介面,實現變了也無所謂。
首先我們還是定義SQLServerDAL,BLL,Model三層,這次我們把DAL與BLL不直接進行互動了,中間插入一個IDAL介面層,這個介面負責與BLL通訊,
BLL通過工廠反射等建立介面IDAL,
private readonly IOrderAction dal = DAOrder.CreateOrderAction();
SQLServerDAL只需實現IDAL即可,
public partial class Orders:IOrders
如果某一天你想換資料庫,只需加相應的介面實現即可。
比如新增一個OracelServerDAL等
或是你提前把全部的資料層寫好SQLServerDAL,OracelServerDAL,MySqlServerDAL……要哪個用哪個
當然,工廠模式帶來的好處也絕不僅僅是上述這點功勞。