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

问题描述:

根据我的经验,web.config文件被广泛诟病。尤其是,当您有多个环境需要支持时,我发现它们很难管理,并且由于缺少更新时的验证和XML的冗长性,因此很难更新。ASP.NET中web.config文件的替代方案

有什么替代方案?

+0

什么是最好的在你自己的想法。告诉我你是否真的有一个伟大的人物。 – 2011-04-02 10:33:42

ASP.NET存在了多长时间;有多少个制作网站正在使用它?

它们几乎都是使用web.config,因为它是开箱即用的。他们不能“过多地”嘲笑它。

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

你可能会说这个少一点。

+1

您可以使用http://msbuildtasks.tigris.org/中的一些任务与ASP.Net 2010-06-06 19:19:18

+1

它会很容易地在这里烘烤几条链接... – penguat 2013-03-08 10:14:03

+0

@penguatm:链接到什么? – 2013-03-08 14:22:41

我强烈反对你断言web.config文件被“广泛诟病”。根据我的经验,它们易于维护和管理,并且在某些情况下是唯一可以放置配置数据的地方。

值得注意的是,VS2010支持每生成配置web.config转换。我有一个web.config,web.debug.config和web.release.config。调试和发布文件会覆盖web.config中指定的连接字符串,并将其替换为正确的字符串,特别是我的调试和生产SQL Server。我也使用这个来设置特定的AppSettings值。

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

也就是说,您可以使用任何存储库来存储任何数据。一个数据库,你选择的格式的文本配置文件,加密的图像,或你有什么。

+0

是的,VS2010每生成web.config转换声音,就像他们将解决我在以前的项目中看到的许多问题。不需要问我的名字 - 查看我的用户名。不过,我确实认为XML配置文件由于冗长而容易出错且难以阅读;在大多数情况下,我更喜欢更简单的键值对列表。 – Ben 2010-06-06 20:16:43

+0

我有一个验证.config文件的签入任务。无论如何,你应该确实有这样做的地方。 – 2010-06-07 15:07:07

+0

@DavidLively您的签入任务如何工作?我们目前通过同行评审来处理,这很耗时。 – penguat 2013-03-08 10:42:44

我个人不介意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"; } } 
} 

优点这种方法的:

  • 类型安全
  • 配置被表示为对象不是关键值对(用于传递配置值的逻辑分组,而不是多个值)
  • 更容易对单元测试依赖于配置值的类
  • 共享con在多个应用程序之间进行配置是微不足道的
  • 部署包含配置实现的程序集将触发应用程序池的回收,就像重新部署web.config一样。

您仍然可以使用web.config中定义的环境,这是我通常通过添加以下到的appSettings做:

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

或者,它可能是机器使用环境不受基于变量或其他构造。