基礎才是(shi)重中(zhong)之重~Data層(ceng)如(ru)何(he)調用(yong)BLL層(ceng)的方法(fa),如(ru)果(guo)覺得奇怪請看本文章
看似不倫不類
這(zhe)個(ge)題目有(you)(you)點(dian)不倫不類(lei),或者說(shuo)有(you)(you)點(dian)偽模式(shi)了,不錯(cuo),確實是這(zhe)樣,我們正(zheng)確的(de)(de)開發(fa)思維是WEB層(ceng)(ceng)->BLL層(ceng)(ceng)->DATA層(ceng)(ceng),每個(ge)層(ceng)(ceng)有(you)(you)對它下(xia)層(ceng)(ceng)的(de)(de)引(yin)用,下(xia)層(ceng)(ceng)不能引(yin)用上層(ceng)(ceng),因為(wei)這(zhe)會(hui)(hui)出現(xian)相互引(yin)用的(de)(de)錯(cuo)誤,在(zai)實際工作中,BLL層(ceng)(ceng)會(hui)(hui)有(you)(you)涉及到各個(ge)業務(wu)的(de)(de)代碼(ma)組織,實現(xian)數據(ju)持久化一般在(zai)Data層(ceng)(ceng)完成,這(zhe)是可以(yi)理解的(de)(de),也是我們經(jing)常使(shi)用的(de)(de)開發(fa)模式(shi),這(zhe)當然不是今天的(de)(de)重點(dian),今天主要說(shuo)一個(ge)實際問題,如訂單處理的(de)(de)場合.
一般訂單處理流程如下:
1 用戶選擇商品(pin)到購物車
2 用戶確定購買,生成訂單
3 選(xuan)擇一種或者幾種支付方式
4 支付(fu)完(wan)成(cheng),回寫訂單(dan),修改訂單(dan)狀態
5 支付交易成功,或者失(shi)敗
OK,這種(zhong)訂(ding)單業務事實上是很復(fu)雜(za)了(le),它會涉(she)及到(dao)很多表的(de)操作,它可能由(you)多個開(kai)發人員去編寫,最后進行統(tong)一組合(he),而為了(le)保證數據的(de)有效(xiao)性(xing),我們會把代碼(ma)重裝到(dao)事務里(li),這時問題就來了(le)
當你的訂單主方(fang)法在data層實(shi)現,如(ru)何去(qu)調用(yong)bll已經寫(xie)好的方(fang)法呢?我(wo)們總不能(neng)(neng)再重(zhong)新寫(xie)一個吧,當然不能(neng)(neng),相(xiang)同的代碼不能(neng)(neng)出現兩(liang)次,這(zhe)是我(wo)們的原則,呵呵.
方法回調
概念:我(wo)們在一(yi)個方法里處(chu)理事(shi)件,事(shi)件處(chu)理完成后,再調(diao)用(yong)原方法層次的(de)某(mou)個方法,這(zhe)種調(diao)用(yong),我(wo)們可(ke)以(yi)(yi)(yi)稱(cheng)為回調(diao)方法,它可(ke)以(yi)(yi)(yi)通過(guo)委(wei)托來(lai)實現,而對于如今的(de)業務,我(wo)們也可(ke)以(yi)(yi)(yi)通過(guo)這(zhe)種方式來(lai)實現,看一(yi)下DEMO
這是(shi)我們(men)的(de)data層方法(fa)簽名:
public void GeneratorOrder(List<Order_Info> list, Action<IUnitOfWork, int, int> authorizeClassroom)
我(wo)們看到,它(ta)的(de)參數(shu)里有個(ge)(ge)Action委托(tuo),它(ta)有三個(ge)(ge)參數(shu),這個(ge)(ge)方(fang)法是(shi)通過BLL層(ceng)(ceng)傳遞進來的(de),當data層(ceng)(ceng)的(de)工(gong)作完(wan)成后,可以(yi)回調這個(ge)(ge)BLL的(de)方(fang)法,我(wo)們看一下(xia)BLL層(ceng)(ceng)這個(ge)(ge)方(fang)法的(de)簽名:
void AuthorizeClassroom(IUnitOfWork db, int userID, int classroomID)
看一下,BLL層(ceng)去調用(yong)data層(ceng)方法,將把(ba)委托實例(li)以參數的形式(shi)傳入data層(ceng)
orderInfoRepository.GeneratorOrder(list, AuthorizeClassroom);
最(zui)后(hou),使(shi)用(yong)我(wo)們的事(shi)務,把它們組合到(dao)一起(BLL層(ceng)與(yu)Data層(ceng)使(shi)用(yong)同一個事(shi)務,注(zhu)意(yi),它不是分布(bu)式事(shi)務,前提是它們的數據上(shang)下文是一個)
TransactionScopeNoMsdtc.UsingNoMsdtc(Db, true, () => { ... }
最后(hou),通過SQL監視工作看(kan)到(dao)的結果就是它們(men)處在同一事務塊里,呵(he)(he)呵(he)(he).