2012-04-26 89 views
1

我目前使用Unity和最小起訂量來做我的WCF單元測試。在應用程序的代碼,我有以下幾點:Microsoft Unity - 是否可以在運行時更改註冊類型?

private void MyMethod() 
{ 
..... 
..... 
    _proxy = new UnityContainer().LoadConfiguration().Resolve<IMyInterface>(); 
..... 
} 

在應用程序的app.config中,我有以下幾點:

<container> 
    <register type="IMyInterface" mapTo="MyActualObject" /> 
</container> 

在單元測試的app.config中,我更換我的模擬代理的對象實現。

<container> 
    <register type="IMyInterface" mapTo="MyMockObject" /> 
</container> 

這一切工作正常。但是我想進一步做某些測試,我想用一個不同的模擬對象實現替換MyMockObject。

是否可以在運行時更改註冊類型?我曾嘗試在運行時修改應用程序配置,但未能檢測到更改。

Configuration appConfig = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
var section = (UnityConfigurationSection)appConfig.GetSection("unity"); 
section.Containers[0].Registrations[0].MapToName = "AnotherMockObject"; 
appConfig.Save(); 

謝謝!!

+0

它看起來像修改在運行時配置文件會工作。我只需要刷新該部分,以便使用ConfigurationManager.RefreshSection(「unity」)不會緩存配置。但是這是實現我所需要的唯一途徑嗎? – 2012-04-26 04:46:40

回答

1

是的,這是可能的。

您可以根據需要多次配置Unity。如果有衝突,最近的定義會獲勝。

在你的情況下,如果你想做一個運行時改變,使用流利的API而不是配置文件。嘗試是這樣的:

IUnityContainer container = new UnityContainer(); 
container.LoadConfiguration(); 
container.RegisterType<IMyInterface, AnotherMockObject>(); 

// use AnotherMockObject 
_proxy = Resolve<IMyInterface>(); 

的文檔Registering Types and Type Mappings

+0

但是,初始化容器的代碼是在應用程序代碼中,而不是在單元測試中。我想改變單元測試本身的類型,我不認爲在容器上使用RegisterType會對所有容器應用相同的更改。 – 2012-04-26 05:05:20

+1

聽起來應用程序沒有正確使用Unity。應該有一個解決所有對象的單一「根」統一實例。被注入的類不應該創建Unity(或者最好甚至不知道它)。他們應該通過構造函數或屬性注入來獲得依賴關係。 – ErnieL 2012-04-26 05:38:40

+0

你能給我舉一個你的意思嗎?單元測試如何控制類型? – 2012-04-26 05:45:47

相關問題