2012-04-26 103 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

相关问题