以ASP.NET為例,簡(jiǎn)單3層就是 DAL, BLL,Model 3層構(gòu)成, DAL層處理數(shù)據(jù),負(fù)責(zé)與數(shù)據(jù)打交道,比如SQL語(yǔ)句的書寫等,DAL層處理完數(shù)據(jù)后的結(jié)果,交由BLL層,BLL層這時(shí)候?qū)?shù)據(jù)進(jìn)行邏輯整理。具體以下詳細(xì)說(shuō)明:
現(xiàn)有1個(gè)簡(jiǎn)單的需求,1個(gè)定單里可能包括幾個(gè)產(chǎn)品,這時(shí)候,我們1般這樣處理,把定單寫在主表,把具體的詳細(xì)商品寫在定單詳細(xì)表,詳細(xì)表中有1個(gè)主表的ID,用于關(guān)聯(lián)2表。當(dāng)用戶下單提交時(shí),處理以下:
兩個(gè)表設(shè)為 主表Orders, 副表 OrderItem
DAL層:寫SQL語(yǔ)句,分別寫兩個(gè)方法,1個(gè)是插入主表的方法,另外一個(gè)是插入副表的方法。
插入主表Orders
插入副表OrderItem,語(yǔ)句這里略掉,這里只說(shuō)明思路,不做真實(shí)的數(shù)據(jù)。
這兩個(gè)方法,首先履行第1個(gè)返回的ID,然后第2個(gè)方法要用到這個(gè)返回的ID,那末這個(gè)邏輯處理就在BLL層里來(lái)處理了,這樣寫:
這個(gè)方法履行完,再返回到頁(yè)面層級(jí)結(jié)果。
注意:其實(shí)上面的業(yè)務(wù)層處理嚴(yán)格的說(shuō)寫的不正確,為何呢?假想我們插入主表成功了,但返回ID后,插入副表的時(shí)候,出錯(cuò)了,沒(méi)有插入,那末就會(huì)造成數(shù)據(jù)庫(kù)里只保存了定單信息,但沒(méi)有定單詳情信息。如何解決呢?自然我們會(huì)想到了事務(wù),1旦出現(xiàn)上述情況,使用事務(wù)時(shí),數(shù)據(jù)庫(kù)會(huì)回滾,就是第2步出錯(cuò)了,那末第1步也會(huì)撤銷。
固然,這就個(gè)就要寫在DAL層里了,在DAL層里把各個(gè)的添加方法寫好了,然后在寫1個(gè)方法,這個(gè)方法就是把各個(gè)方法加到事務(wù)中去,如果有1條語(yǔ)句履行時(shí)出錯(cuò),則事務(wù)回滾,等于沒(méi)有操作。
這基本上是1個(gè)簡(jiǎn)單3層的形象的最簡(jiǎn)單的介紹,那末簡(jiǎn)單3層有時(shí)候不能滿足我們需要,比如說(shuō),你是1家軟件公司,那末你開(kāi)發(fā)了1個(gè)軟件,用的SQLServer,而恰好碰到1個(gè)客戶需要使用oracle,或是mysql,怎樣辦?固然,你也能夠改,但是改的東西多了,最最少全部數(shù)據(jù)層都要被你扒了1遍了,而有1種方法基本不用怎樣修改就能夠到達(dá)需求,那就是工廠模式。
簡(jiǎn)單介紹:使用工廠模式,面向接口的編程,把數(shù)據(jù)層和業(yè)務(wù)層使用接口來(lái)交接,面向接口,不面向具體的實(shí)現(xiàn),只要操作接口,實(shí)現(xiàn)變了也無(wú)所謂。
首先我們還是定義SQLServerDAL,BLL,Model3層,這次我們把DAL與BLL不直接進(jìn)行交互了,中間插入1個(gè)IDAL接口層,這個(gè)接口負(fù)責(zé)與BLL通訊,
BLL通過(guò)工廠反射等創(chuàng)建接口IDAL,
SQLServerDAL只需實(shí)現(xiàn)IDAL便可,
如果某1天你想換數(shù)據(jù)庫(kù),只需加相應(yīng)的接口實(shí)現(xiàn)便可。
比如添加1個(gè)OracelServerDAL等
或是你提早把全部的數(shù)據(jù)層寫好SQLServerDAL,OracelServerDAL,MySqlServerDAL……要哪一個(gè)用哪一個(gè)
固然,工廠模式帶來(lái)的好處也絕不單單是上述這點(diǎn)功勞。