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

时间:2010-06-06 19:11:40

标签: asp.net web-config

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

有哪些替代方案?

3 个答案:

答案 0 :(得分: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"; } }
}

此方法的优点:

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

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

<appSettings>
     <!-- accepts: dev|stage|prod -->
     <add key="Env" value="dev" />
</appSettings>

或者,它可以是基于机器的,使用Envrionment Variables或其他一些构造。

答案 1 :(得分:4)

ASP.NET已存在多久;有多少生产网站正在使用它?

他们几乎都在使用web.config,因为它来自开箱即用。他们不能过多地“辱骂”它。

也就是说,看看.NET 4.0中ASP.NET的新功能,包括配置特定的web.config文件,以及web.config的基于xml的转换,允许生成特定于环境的web.config版本在部署时。

你可以贬低一点。

答案 2 :(得分:0)

我强烈反对你断言web.config文件“受到广泛辱骂”。根据我的经验,它们易于维护和管理,在某些情况下,您可以放置​​配置数据。

值得注意的是,VS2010支持每个构建配置web.config转换。我有一个web.config,web.debug.config和web.release.config。对于我的调试和生产SQL Server,调试和释放文件会覆盖web.config中指定的连接字符串,并用正确的字符串替换它们。我也使用它来使一些AppSettings值特定于配置。

由于您可以根据需要为多个不同的目标或配置添加构建配置,因此我不明白为什么您需要通过设计另一个存储库来重新发明轮子。

也就是说,您可以使用任何存储库来存储您想要存储的任何数据。数据库,您选择的格式的文本配置文件,加密图像或您拥有的内容。