2011-05-04 51 views
5

我有一個WCF服務,它有幾個不同的職責,但它爲任何與我的代碼交互的人提供了一個切入點。爲了簡單起見,假設有2種方法IOC容器 - WCF服務 - 我應該通過構造函數實例化所有依賴項嗎?

private IMethodAHelper _methodA; 
    private IMethodBHelper _methodB; 

    public MyService(IMethodAHelper methodA, IMethodBHelper methodB) 
    { 
     _methodA = methodA; 
     _methodB = methodB; 
    } 

    public void MethodA() { 
     _methodA.CallThis(); 
    } 

    public void MethodB() { 
     _methodB.CallThis(); 
    } 

因爲消費者只會調用該服務的一個原因,治法或方法b,它是一個問題,即IOC容器將是不必要的旋轉起來所有的依賴?我想提供一個入口點,所以我不想分解這個服務,但是當每個服務的使用者只需要一個子集時,旋轉所有的依賴關係似乎有點浪費。

我想這樣做的另一種方式是像

public void MethodA() { 
     var methodA = ObjectFactory.GetInstance<IMethodAHelper>(); 
     methodA.CallThis(); 
    } 

這使得每個「路徑」彈出它所需要的依賴關係,但是,這使得它要困難得多寫單元測試。有沒有人有什麼建議?它是如何激化所有依賴關係的問題?在此服務的第一個入口點之後,通過構造函數注入依賴關係是有意義的,但在此入口點處,建議的方法是什麼?

回答

2

由於馬克賽義德你不應該擔心創建不使用的依賴關係,除非你有一些實際的教授(從探查器的時間),他們是昂貴的創建。如果創建組件需要花費一些代價,則可能需要使用支持惰性注入的容器,如AutoFac。這樣你可以有懶惰注入,這將只在第一次使用時被構建。

1

我不知道你在做什麼的細節,但將它們分解成單獨的服務可能更有意義。

2

依賴注入的一般規則是,類需要正常工作的所有(必需)依賴項應通過構造函數注入來注入。

所有(可選)依賴關係應通過屬性注入注入。在這種情況下可選的是,當類提供接口的默認實現並且您想要在運行或配置時更改接口實現。

無論如何,我同意馬克塞曼的答案。

相關問題