2013-03-18 34 views
3

我想爲自己定義一些依賴注入指南。在定義要通過構造函數或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專家的建議。什麼是正確的解決方案(如果有的話)?在上述情況下你會做什麼?

謝謝。

回答

0

這是存儲庫類的最小相關性。

我認爲這是找出合適的耦合量的起點。您應該注射不超過或少於滿足要求所需的量。

這是一個非常通用的指導方針,幾乎相當於「它取決於」,但它是開始思考它的好方法。我對DataSource,SqlSession或SqlSessionTemplate的背景知之甚少。

repository類內部利用了SqlSessionTemplate (實施SqlSession的接口)

爲什麼不能倉庫只需使用接口的依賴?界面是否不涵蓋實施的所有公共方法?如果沒有,界面甚至是一個有用的抽象?

我不能完全拼湊你正在嘗試做的,依賴關係是如何工作的,但我最好的猜測可以是:

  1. 您需要的SqlSession和DataSource通過構造函數注入,或
  2. 您需要的SqlSession通過資源庫的構造函數注入,和DataSource注入SqlSessionTemplate的構造
+0

我故意不附加Java標記用的問題。這個問題是概念性的,它同樣適用於.net(如果你屬於它的話)。這個困境是API可用性和單元測試之間的折衷。我以倉庫爲例,但它可能是一個框架類與許多消費者。爲了提供你更多的情況下,SqlSessionTemplate是一個SqlSession實現,但它不能完全由接口,信守合同。換句話說,IMO違反了LSP(Liskov Subst。Principle)。 SqlSession接口可以被認爲是輕量級的ORM映射器。 – 2013-03-19 06:10:30

+0

從概念上講,DataSource與ADO.net SqlConnection類似。 – 2013-03-19 06:12:09

0

你說的是單元測試你的資料庫,但這通常是無用的,因爲存儲庫是您通往數據庫的入口,並且與其強大的耦合。單元測試應該單獨進行,但只能用數據庫對存儲庫進行測試。因此:集成測試。

如果你能夠從存儲庫抽象數據庫特定的邏輯(如你似乎在做),就什麼也沒有留下來測試,因爲倉庫的責任是與數據庫進行通信。而如果仍然留下了很多測試,嗯......在這種情況下你的資料庫類可能違反Single Responsibility Principle,使您的存儲庫難以維持。

因此,由於您通常會使用數據庫測試存儲庫本身,因此從測試的角度來看,注入的內容並不重要,因爲您必須構建一個存儲庫以便能夠連接到一個數據庫無論如何。

+0

我知道集成測試對存儲庫應用的不止是單元測試。我以倉庫爲例。它可能是一個服務類,或者是一個低級框架類。您可以使用非存儲庫類來可視化情況。 – 2013-03-19 10:42:15

相關問題