C#ASP.Net 5配置和向后兼容类库

时间:2015-09-17 15:27:25

标签: c# asp.net

我有多个遗留库,可以通过ConfigurationManager自行配置。例如:

var port = ConfigurationManager.AppSettings["service.port"];

新的ASP.Net系统更喜欢基于附加" config.json"的强类型模型。文件。示例(取自Rick Strahl's Web Log):

//from AppSettings.cs
public class AppSettings
{
    public string SiteTitle { get; set; }
}

//from config.json
{
    "AppSettings": {
        "SiteTitle": "WebApplication2",
    },
    "Data": {
        "DefaultConnection": {
            "ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=blahfoo;Trusted_Connection=True;MultipleActiveResultSets=true"
        }
    }
}

// from Startup.cs
public class Startup
{
    public IConfiguration Configuration { get; set; }

    public Startup(IHostingEnvironment env)
    {
        // Setup configuration sources.
        var configuration = new Configuration()
            .AddJsonFile("config.json")
            .AddJsonFile($"config.{env.EnvironmentName}.json", optional: true);

        configuration.AddEnvironmentVariables();
        Configuration = configuration;
    }

    public void ConfigureServices(IServiceCollection services)
    {
        // Add Application settings to the services container.
        services.Configure<AppSettings>(Configuration.GetSubKey("AppSettings"));

        …
    }
}

我的问题:是否有办法采用新的ASP.Net 5及其强类型配置方法,同时保持与其他应用程序库的向后兼容性?

或者说,我可以使用我们投资组合中的公共库而无需重写它们吗?

1 个答案:

答案 0 :(得分:1)

您的问题是您依赖于具体的配置实现并使用了类中的ConfigurationManager静态成员,而不是使用适当的依赖注入编写SOLID实现。

你可以找到一些hacky技巧,你不必改变你的代码来使用新的配置模型,但我认为你应该帮自己一个忙,并把它作为实际重新考虑因素的机会您的代码并在一个简单的界面后面抽象您当前的配置,例如:

public interface IMyAppConfiguration { string Setting1 { get; } string Setting2 { get; } SomeOtherMoreComplexSetting Setting3 { get; } }

然后在需要其中一个设置的每个类中注入此依赖项,并提供一个包装当前ConfigurationManager类的实现和另一个包装新配置模型的实现。

这是一个很好的例子,为什么SOLID设计很重要,如果做得好,可以使代码维护和创新更容易。