C# 注入应用程序配置的最佳方法
好吧,我正进入这个奇妙的网站,询问如何正确地将配置设置注入到应用程序组件中。因此,概述如下:我有一个用C#.NET3.5编写的应用程序。它由3个组件组成——一个核心、一个数据和一个服务。数据和服务程序集需要从app.config检索设置,这是通过设置文件完成的,例如 代码:C# 注入应用程序配置的最佳方法,c#,configuration,inversion-of-control,C#,Configuration,Inversion Of Control,好吧,我正进入这个奇妙的网站,询问如何正确地将配置设置注入到应用程序组件中。因此,概述如下:我有一个用C#.NET3.5编写的应用程序。它由3个组件组成——一个核心、一个数据和一个服务。数据和服务程序集需要从app.config检索设置,这是通过设置文件完成的,例如 代码: public static String RequestQueueConnectionString { get { return ConnectionSettings.Default.RequestQueueConn
public static String RequestQueueConnectionString
{
get { return ConnectionSettings.Default.RequestQueueConnectionString; }
}
配置:
<applicationSettings>
<MyNamespace.Data.ConnectionSettings>
<setting name="RequestQueueConnectionString" serializeAs="String">
...
我希望能够将一个已经填充的配置类注入到IoC容器中,以便这些设置用于该程序集,而不是设置文件/app.config中指定的设置。所以也许:
public static void ConfigureStructureMap(IContainer container, MyConfigClass config)
{
container.Configure(x => x.For<DataConfig>()
.Singleton()
.Use ???
...
publicstaticvoidconfigurestructuremap(IContainer容器,MyConfigClass配置)
{
Configure(x=>x.For())
.Singleton()
.使用???
...
我希望我在这里提供了足够的细节-如果我没有提供,请原谅一个新手,并请让我知道还有什么可以帮助我回答这个问题!因此,经过大量的搜索和尝试和错误,我得到了@default.kramer的链接,我严格遵循了它!再次尝试和错误一点(在我看来,这是最好的方式),我设法得到了我想要的解决方案。现在,虽然你可以点击链接(我强烈建议你这么做),但我将在我实现问题的过程中发布解决方案。希望这可以帮助有类似问题的人 现在,我有了这样的配置设置类:
public static class DispatchConfiguration
{
public static void ConfigureStructureMap(IContainer container, IDispatchConfiguration dispatchConfig)
{
DispatchProcessBatchSize = dispatchConfig.DispatchProcessBatchSize;
ServiceIsActive = dispatchConfig.ServiceIsActive;
...
}
public interface IDispatchConfiguration
{
Int32 DispatchProcessBatchSize { get; }
Boolean ServiceIsActive { get; }
...
}
现在,在我使用设置文件从app.config文件中检索配置之前。这显然有助于确保我在更改配置设置时具有灵活性,但这给我带来了无法轻松测试这些设置的问题。例如,9/10测试要求服务处于活动状态,但1个测试想要测试“ServiceIsActive=false;”,现在我有麻烦了
但是,现在我可以从测试中注入配置:
[Given(@"Config\.IsServiceActive returns false")]
public void GivenConfig_IsServiceActiveReturnsFalse()
{
var settings = new DispatchSettings
{
ServiceIsActive = false,
DispatchProcessBatchSize = 100,
UpdatedBy = "Unit Test"
};
DispatchConfiguration.ConfigureStructureMap(ObjectFactory.Container, settings);
}
然后在现实世界中,我可以从app.config获取设置:
public void Start(String[] args)
{
var dispatchConfig = this.GetDispatchConfiguration();
DispatchConfiguration.ConfigureStructureMap(ObjectFactory.Container, dispatchConfig);
...
}
private IDispatchConfiguration GetDispatchConfiguration()
{
var config = (DispatchSettings)ConfigurationManager.GetSection("DispatchSettings");
return config;
}
然后实际的配置类看起来像:
[XmlRoot(ElementName = "DispatchSettings", Namespace = "")]
public sealed class DispatchSettings : IDispatchConfiguration
{
public Int32 DispatchProcessBatchSize { get; set; }
public Boolean ServiceIsActive { get; set; }
...
}
为了完整性起见,界面如下所示:
public static class DispatchConfiguration
{
public static void ConfigureStructureMap(IContainer container, IDispatchConfiguration dispatchConfig)
{
DispatchProcessBatchSize = dispatchConfig.DispatchProcessBatchSize;
ServiceIsActive = dispatchConfig.ServiceIsActive;
...
}
public interface IDispatchConfiguration
{
Int32 DispatchProcessBatchSize { get; }
Boolean ServiceIsActive { get; }
...
}
最后,配置文件如下所示:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="DispatchSettings" type="MyNamespace.XmlConfigurator, MyNamespace.Core" />
</configSections>
<DispatchSettings type="MyNamespace.DispatchSettings, MyNamespace.Core">
<ServiceIsActive>True</ServiceIsActive>
<DispatchProcessBatchSize>100</DispatchProcessBatchSize>
</DispatchSettings>
这就对了!我希望这能让任何有类似问题的人都能解决它,并且足够清楚,可以遵循!您可能需要查看。