我正尝试通过Unity注入ConfigurationManager.AppSettings,以便明智地进行测试,我们可以注入AppSettings的特殊形式的集合。
例如,给定具有接口ClassName
的类IClassName
,并且ClassName实现使用配置参数,即System.Configuration.ConfigurationManager.AppSettings
public class ClassName : IClassName
{
public ClassName(System.Collections.Specialized.NameValueCollection AppSettings)
{
this._AppSettings = AppSettings;
}
public void DoSomething()
{
var urlToCall = _AppSettings["DoSomething.BaseUrl"] + "api/twitter/post";
//...
}
}
由于ConfigurationManager.AppSettings不是特定类型,因此从AppSettings实际返回的类型为System.Collections.Specialized.NameValueCollection
,这可能太笼统而无法连接到返回ConfigurationManager.AppSettings,这是一个好方法,当注册类型,以仅将参数名称为“ AppSettings”且类型为System.Collections.Specialized.NameValueCollection
换句话说,我可以在参数名称为AppSettings
的条件下使用RegisterType并输入System.Collections.Specialized.NameValueCollection
来返回ConfigurationManager.AppSettings还是走可配置的工厂路线,但这会导致我进入以下内容实现,这是要额外编写的许多代码。啊。 Factory仍将需要具有一个静态变量以一种或另一种方式对其进行调整,并且在测试中使用(web / app)配置可能很难实现。
我宁愿不这样做:创建一个IAppSettings
接口,该接口可以提供一个实例,其中一个实现从ConfigurartionManager.AppSettings请求的键返回值,而另一个实现仅从内部从NameValueCollection返回值的实现。在测试期间填充。