這不應該發生。我最常做的是有一個模塊結構是這樣的:
root
- api (interfaces, enums and custom exceptions only)
- impl (standard implementation of api -> dependency to api)
- server (runtime dependency to impl, compile time to api only)
- client (dependency to api only)
比方說,我們有api
模塊的接口Person
。現在在impl
模塊中,您將有一個類JpaPerson
,因爲impl
使用JPA。但是,這些是客戶端和服務器現在不需要的細節,所以您不應該(並且在我的設計中不能)在client
或server
中執行new JpaPerson()
。相反,你就會有一個接口(內api
也)被稱爲PersonFactory
(當你在談論的人聽起來很可怕,也許它命名爲更加人性化),有這樣的方法:
public interface PersonFactory{
Person findPersonBySsn(String socialSecurityNumber);
List<Person> findPersonsByName(String firstName, String lastName);
List<Person> findPersonByBirthDate(Date birthDate);
Person createPerson(
String firstName, String lastName,
Date birthDate, String socialSecurityNumber
);
}
再次,實施此接口位於impl
模塊中,但只能在其他模塊中將其作爲接口引用。然後使用dependency injection將東西連接在一起(Spring,SEAM,EJB3等等)。
您提到的情況是代碼處理超出它的責任的結果(請參閱separation of concerns)。
這個設計的一大優點是,您可以單獨重構所有模塊(除api
外),而無需更改其他模塊中的代碼。所以如果你想從jpa切換到經典的休眠,你只需要編輯impl
。如果要將服務器從軸切換到cxf,只需更改server
。這使事情變得更容易。當然,你不會得到循環依賴。
編輯:
一個簡單的(簡單的)解決方案爲你會以引入被包括作爲在,b和c的依賴關係的模塊d。將所有常用代碼移至d。 (實際上將這個d重命名爲a和a,b,c到b,c,d)。
謝謝...非常有用的解釋... – 2010-07-29 08:46:42