我想爲自己定義一些依賴注入指南。在定義要通過構造函數或setter注入來注入的類的依賴關係時,什麼應該是正確的粒度?這個類可以是服務,資源庫等,假設有一個庫類,它看起來像以下:構造函數或setter注入時依賴關係的粒度是多少?
public class ProductRepository
{
//Option-A
public ProductRepository(DataSource dataSource)
{
}
//Option-B
public ProductRepository(SqlSession sqlSession)
{
}
//Option-C
public ProductRepository(SqlSessionTemplate sqlSessionTemplate)
{
}
}
通過上面的類所需的最小的依賴是DataSource接口。存儲庫類在內部使用SqlSessionTemplate(SqlSession接口的實現)。如代碼所示,構造函數有3種構造函數可供選擇。以下是我的理解:
選項-A(數據源依賴項) 這是存儲庫類的最小相關性。從消費者的角度來看,這個構造函數是正確的選擇,但從單元測試的角度來看,它並不適合,因爲DataSource在存儲庫實現中由SqlSessionTemplate內部使用。
選項-B(SqlSession的依賴性) 這從圖單元測試點的正確選擇,但不是從消費者的角度出發。此外,存儲庫實現與SqlSessionTemplate接口的特定實現緊密結合。因此,如果消費者通過除SqlSessionTemplate之外的其他SqlSession接口,它將不起作用。
選項-C(SqlSessionTemplate依賴性) SqlSessionTemplate是一種實現,而不是接口似乎並不好進行單元測試。另外,對於消費者來說這並不好,因爲與DataSource相比,實例化SqlSessionTemplate涉及更多。因此放棄這個選項。
選項-A和選項-B似乎是可用的選擇。但是,在消費者觀點和單元測試觀點之間有一個折衷,反之亦然。
我是新來的依賴注入。我尋求DI專家的建議。什麼是正確的解決方案(如果有的話)?在上述情況下你會做什麼?
謝謝。
我故意不附加Java標記用的問題。這個問題是概念性的,它同樣適用於.net(如果你屬於它的話)。這個困境是API可用性和單元測試之間的折衷。我以倉庫爲例,但它可能是一個框架類與許多消費者。爲了提供你更多的情況下,SqlSessionTemplate是一個SqlSession實現,但它不能完全由接口,信守合同。換句話說,IMO違反了LSP(Liskov Subst。Principle)。 SqlSession接口可以被認爲是輕量級的ORM映射器。 – 2013-03-19 06:10:30
從概念上講,DataSource與ADO.net SqlConnection類似。 – 2013-03-19 06:12:09