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

4

根据我的经验,web.config文件是广泛被诟病的。特别是在需要支持多个环境和更新时,它们很难管理,并且由于缺乏验证和XML冗长而难以更新。

那么有什么替代方案呢?


你自己认为什么是最好的?如果你真的有很棒的观点,请告诉我。 - user605334
3个回答

5

对于小型临时应用程序,我个人并不介意使用Web.Config,但对于任何重要的应用程序配置,我避免使用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>

另外,也可以通过使用环境变量或其他结构来实现机器化。


4
ASP.NET存在多长时间了?有多少生产网站在使用它?
几乎所有网站都使用ASP.NET自带的web.config。他们似乎并不太反感这个配置文件。
话虽如此,.NET 4.0中的新功能值得一看,包括针对特定配置的web.config文件和基于xml的转换,允许在部署时生成特定环境的web.config版本。
这样你可能就不会太反感它了。

1
您可以使用http://msbuildtasks.tigris.org/中的一些任务与ASP.Net <4.0一起实现相同的转换。在我看来,这是必须的。 - Mikael Svenson

0

我强烈反对你所说的web.config文件是“广泛被鄙视”的说法。在我的经验中,它们易于维护和管理,并且在某些情况下是您可以放置配置数据的唯一位置。

值得注意的是,VS2010支持每个构建配置web.config转换。我有一个web.config、web.debug.config和web.release.config。调试和发布文件覆盖了web.config中指定的连接字符串,并用正确的字符串替换它们,针对我的调试和生产SQL服务器。我还使用这个来使一些AppSettings值特定于配置。

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

话虽如此,您可以使用几乎任何存储库来存储您想要存储的任何数据。数据库、文本配置文件以您选择的格式、加密图像等等。


是的,VS2010预构建的web.config转换似乎可以解决我在之前项目中遇到的许多问题。不需要问我的名字 - 看看我的用户名就好了。然而,我认为XML配置文件容易出错,并且由于它们的冗长性难以阅读;在大多数情况下,我更喜欢一个更简单的键值对列表。 - Ben Aston
我有一个签入任务,用于验证.config文件。不管怎样,你真的应该有一个能够做到这一点的东西。 - 3Dave
@DavidLively 你的签入任务是如何工作的?目前我们通过同行审查来处理,这是很耗时间的。 - penguat
@penguat 我们的CI服务器(TeamCity)会根据模式文件验证web.config XML。实际内容则通过单元测试进行验证。 - 3Dave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接