ASP.NET中web.config文件的替代方案
根据我的经验,web.config文件被广泛诟病。尤其是,当您有多个环境需要支持时,我发现它们很难管理,并且由于缺少更新时的验证和XML的冗长性,因此很难更新。ASP.NET中web.config文件的替代方案
有什么替代方案?
ASP.NET存在了多长时间;有多少个制作网站正在使用它?
它们几乎都是使用web.config,因为它是开箱即用的。他们不能“过多地”嘲笑它。
也就是说,查看.NET 4.0中ASP.NET的新功能,包括特定于配置的web.config文件以及web.config的基于xml的转换,这些转换允许特定于环境的web.config版本为在部署时生成。
你可能会说这个少一点。
您可以使用http://msbuildtasks.tigris.org/中的一些任务与ASP.Net 2010-06-06 19:19:18
它会很容易地在这里烘烤几条链接... – penguat 2013-03-08 10:14:03
@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值。
由于您可以根据需要为不同的目标或配置添加构建配置,我不明白为什么您会觉得需要通过设计另一个存储库来重新发明*。
也就是说,您可以使用任何存储库来存储任何数据。一个数据库,你选择的格式的文本配置文件,加密的图像,或你有什么。
我个人不介意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>
或者,它可能是机器使用环境不受基于变量或其他构造。
什么是最好的在你自己的想法。告诉我你是否真的有一个伟大的人物。 – 2011-04-02 10:33:42