加入設計模式後事務遇到的迷惑,還請各位大哥解難

popufig發表於2005-03-09
在做一個C/S的給老大們演示的例子(一個介面上操作兩個主從表,主從表的異動(新增、刪除、修改),都要放到同一個事務裡),使用了Business Delegate、Service Locator、Session Façade、Transfer Object、Data Access Object幾種設計模式,後臺資料庫是想用CMP做資料的異動(新增、刪除、修改),讀取資料由DAO或者透過JDBC、Hibernate之類的技術去實現。

DAO我是寫了一個介面,然後不同的表實現了不同的DAO介面,然後由Session Façade去呼叫不同的DAO實現,由於只有兩個表,我只寫了一個Session Façade,在Session Façade的ejbCreate裡注入了DAO的不同實現,由此根據不同的注入可以操作不同的表。

按我的理解,Session Façade應該要分出一定的層次,也就是說假設Session Façade裡面底層有方法Amethod、Bmethod、Cmethod,這三個方法是直接操作DAO,而Dmethod是呼叫了Amethod和Bmethod、Emethod呼叫了Bmethod和Cmethod,還有可能Fmethod是呼叫了Dmethod和Emethod,也就是一層一層的疊上去,我理解這樣可以提高程式碼的重用性。然後再由客戶端透過Business Delegate呼叫Session Façade裡面的方法。

現在問題來了:
1、在Session Façade和CMP直接加入的DAO是不是多餘的呢?(我的考慮是或許以後可以提供不同的實現,保證一定的靈活性)

2、由於我是在Session Façade裡的ejbCreate裡注入了所需要的DAO實現,也就是說我的Business Delegate在呼叫Session Façade的時候需要知道我所需要的具體的DAO的實現(至少是要知道實現類的名字),這樣是不是會跨層了,按理說Business Delegate只需要知道Session Façade,但是現在還要求他知道DAO的東西,是不是有點...... ,心理總感覺怪怪的。

3、由於要求主從表的異動都要在一個事務裡,而且我們不可能一次異動要多次和Session Façade互動,也就是說Session Façade裡需要一次幫我們搞定,這樣子似乎剛才的ejbCreate注入DAO的實現根本不能用了(因為有可能操作兩個DAO),而且Session Façade裡會因為剛才我們需要的一次到位的方法,在Session Façade出現越來越多的層次(這時候似乎Facade裡面的分層成了一個累贅)。

4、事務該在哪裡進行控制,DAO肯定是不可能,而Session Façade裡由於考慮了重用性和客戶端的需要分了很多的層次,裡面的各個層次都很可能在以後會被Business Delegate呼叫,所以在Session Façade進行事務控制似乎也不行??

我該怎麼做?請大家各抒己見,多多發表自己的觀點和意見!!

第一次在jdon發帖子,希望大家多多支援,謝謝!!!

相關文章