我正在尋找關於如何將運行時依賴注入到從Hibernate檢索的JPA實體中的建議。我的問題本質上是這樣的:需要模式建議(Hibernate + Guice)
我有一些交易對象的不同子類。每個Transaction子類在執行時都有不同的行爲,並且需要來自環境的一組不同的依賴關係。這些Transaction對象由Hibernate作爲JPA實體進行管理,因此我無法有效地使用Guice進行依賴注入,以便像我在其他應用程序中那樣使用它們的環境依賴項來填充實例。
要解決這個問題,我已經採取了一個辦法,就是有點類似訪問者模式,如下:
public abstract class Transaction {
// ...snip...
public abstract void apply(Transactor transactor);
}
public class TransactionA extends Transaction {
public void apply(Transactor transactor) {
transactor.execute(this);
}
}
public class TransactionB extends Transaction {
public void apply(Transactor transactor) {
transactor.execute(this);
}
}
// other Transaction subclasses with the same boilerplate
public interface Transactor {
public void execute(TransactionA trans);
public void execute(TransactionB trans);
// corresponding methods for other transaction types.
}
public class BeginTransactor {
@Inject
private Foo execAdep;
public void execute(TransactionA trans) {
execAdep.doSomething(...)
}
@Inject
private Bar execBdep;
public void execute(TransactionB trans) {
execBdep.doOther(...)
}
}
我有一個交易週期的不同部分的交易者的各種實現方式。這些可以是依賴注入使用吉斯到我要處理的事務,在這裏我簡單的調用上下文:
Transactor transactor = injector.getInstance(BeginTransactor.class); //Guice injection
Transaction t = ... //get a transaction instance
t.apply(transactor);
我不喜歡這種方法是什麼(1)不是每個類型的交易應該在每個生命週期階段都可執行,但每個Transactor必須爲每個事務子類實現一個execute()方法,並且(2)基本上沒有一個注入的依賴項用於處理多個事務類型。
本質上,我的Transactor接口&實現了很多不相干的crud glopped在一起。理想情況下,我只需在事務對象本身擁有execute()方法,但我不希望調用代碼必須知道事務的類型或它需要的依賴關係。另外,這可能會使測試變得更加困難,因爲如果它是Transaction對象的具體方法,我不能輕易地模擬出execute()方法。使用Transactor接口意味着我可以根據需要輕鬆地嘲笑它。
任何人都可以建議如何解決這個問題的類型安全的方式,不會導致一堆大多數不相關的行爲一起在Transactor中一起出現,但保持可測試性並允許依賴注入?
非常好,謝謝!我曾懷疑可能有AOP方法解決這個問題,但並不確定如何去解決這個問題。 – 2008-12-17 16:19:04