2009-05-06 66 views

回答

22

簡短的回答是肯定的。

當您使用Resolve方法時應該自動傳遞。

例如:

IUnityContainer container = new UnityContainer(); 
var something = container.Resolve<Something>(); 

此外,這是一個棱鏡(CodePlex上),如果你想看看使用相同的技術。

更新加入的測試:

[TestClass] 
public class Spike 
{ 
    [TestMethod] 
    public void unityTest() 
    { 
     var container = new UnityContainer(); 
     var something= container.Resolve<Something>(); 
     Assert.AreSame(container, something.Container); 
     // This passes. Success. 
    } 
} 

public class Something 
{ 
    public Something(IUnityContainer container) 
    { 
     Container = container; 
    } 

    public IUnityContainer Container { get; set; } 
} 
+4

有沒有必要註冊與自己的容器。它將默認解決IUnityContainer依賴關係本身。 – 2009-05-06 13:37:01

+0

昨天晚上我沒有時間運行秒殺感謝指出。我添加了我使用的測試。 – bendewey 2009-05-06 14:13:21

0

正如bendewey提到的,你可以通過它,因爲它是一個對象,像任何其他對象,但是,爲什麼過了嗎?

你只有一個,爲什麼沒有它是任何類可以訪問的靜態屬性?

+2

我對這種方法的擔心是它可能對包含靜態類的項目造成不必要的依賴關係。根據我的經驗,注入容器也有助於測試。 – bendewey 2009-05-06 13:35:49

1

第一個答案就是我在想什麼。謝謝。

此前團結,我們建立了自己的IOC容器,我們有一個語法類似...

<constructor> 
    <param name="factory" value="[{factory}]"/> 
</constructor> 

的[{}廠]使其自身作爲參數傳遞。

至於將其設置爲靜態:我不喜歡使用該方法,因爲每個對象都依賴於單個屬性(顯然)。它的可重用性較差,可測試性較差,尤其是靜態只讀(應該是這種情況)。靜態設置完成後,您不能(或不應該))混亂,這會限制您可以創建的測試場景。

如果沒有別的,那麼對象應該至少能夠接受容器作爲參數。如果它不在那裏,那麼它可能會回落到靜態。

我們走下了使用單一實例的道路,並最終改變了一切。在我看來,對象應該比這更靈活。如果對象的消費者想要將它傳遞給它的對象的單個實例,這取決於消費者。但是,對象本身不應該要求它。使用上面顯示的語法,它很容易通過圖形傳遞容器。

感謝您的信息。

Jay

對不起......新人。我現在看到這應該是一個評論,而不是一個答案。

相關問題