ASP.NET中web.config文件的替代方法

Ben*_*Ben 4 asp.net web-config

根据我的经验,web.config文件受到广泛谴责.特别是,当您有多个支持环境时,我发现它们很难管理,并且由于缺少更新时的验证和XML的冗长而需要更新.

有哪些替代方案?

cto*_*orx 5

我个人不介意Web.Config用于小型一次性应用程序,但对于任何实质性的东西,我都避免将它们用于应用程序配置.

这是我做的......

  • 我根据复杂性为我的配置定义了一个或多个接口.
  • 我为每个环境创建不同的实现(dev,stage,prod等)
  • 我使用抽象基类来定义常见配置.
  • 然后我使用Ninject进行依赖注入,因此根据我所针对的环境提供适当的实现.
  • 我总是编写配置接口代码并从编译时检查中受益.

这是一个例子......

// Config Contract
public interface IWebAppConfig
{
     string SmtpHost { get; }
     string RootUrl { get; }
}

// Define Common Config Values (values that don't change per environment) 
public abstract class AbstractWebAppConfig : IWebAppConfig
{
     public string SmtpHost { get { return "smtp.google.com"; } }
     public abstract RootUrl { get; }
}

// Dev Config Settings
public class DevWebAppConfig : AbstractWebAppConfig
{
     public override string RootUrl { get { return "http://localhost:1322"; } }
}

// Stage Config Settings
public class StageWebAppConfig : AbstractWebAppConfig
{
     public override string RootUrl { get { return "http://stage.mysite.com"; } }
}

// Prod Config Settings
public class ProdWebAppConfig : AbstractWebAppConfig
{
     public override string RootUrl { get { return "http://www.mysite.com"; } }
}
Run Code Online (Sandbox Code Playgroud)

这种方法的优点:

  • 输入安全
  • 配置表示为对象而不是键值对(用于传递配置值的逻辑分组而不是多个值)
  • 更容易单元测试依赖于配置值的类
  • 跨多个应用程序共享配置是微不足道的
  • 部署包含配置实现的程序集将触发应用程序池的循环,就像重新部署web.config一样.

您仍然可以使用web.config来定义环境,这是我通常通过将以下内容添加到appSettings来执行的操作:

<appSettings>
     <!-- accepts: dev|stage|prod -->
     <add key="Env" value="dev" />
</appSettings>
Run Code Online (Sandbox Code Playgroud)

或者,它可以通过使用Envrionment Variables或其他一些构造来基于机器.