C# 注入应用程序配置的最佳方法

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

好吧,我正进入这个奇妙的网站,询问如何正确地将配置设置注入到应用程序组件中。因此,概述如下:我有一个用C#.NET3.5编写的应用程序。它由3个组件组成——一个核心、一个数据和一个服务。数据和服务程序集需要从app.config检索设置,这是通过设置文件完成的,例如

代码:

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>
这就对了!我希望这能让任何有类似问题的人都能解决它,并且足够清楚,可以遵循!

您可能需要查看。