.net net中基于脚本的配置?

.net net中基于脚本的配置?,.net,web-config,.net,Web Config,web.config/app.config的一个缺点是它到处都是神奇的字符串,因为它只是一个XML文件 像PHP或Ruby这样的解释语言的优点是,配置只是执行的代码。在.net中,在代码中进行工作需要重新部署,这与目的背道而驰 现在,在基于或PowerShell构建自己的web.config替换之前,我想知道是否存在现有的web.config替换 例如,这里的代码很简单,但在web.config中却很难/笨拙: IList<TimeZoneInfo> allowedTimeZones

web.config/app.config的一个缺点是它到处都是神奇的字符串,因为它只是一个XML文件

像PHP或Ruby这样的解释语言的优点是,配置只是执行的代码。在.net中,在代码中进行工作需要重新部署,这与目的背道而驰

现在,在基于或PowerShell构建自己的web.config替换之前,我想知道是否存在现有的web.config替换

例如,这里的代码很简单,但在web.config中却很难/笨拙:

IList<TimeZoneInfo> allowedTimeZones =
         System.TimeZoneInfo.GetSystemTimeZones()
           .Where(tz => tz.DisplayName.Contains("Central"));
IList允许时区=
System.TimeZoneInfo.GetSystemTimeZones()
其中(tz=>tz.DisplayName.Contains(“中心”));
基本上,每次需要执行复杂的操作来创建对象时,基于XML/字符串的配置都会变得非常混乱


例如,如果AllowedTimeZone真的应该是“从‘Central’开始,但不包含‘Europe’”,那么您可以开始在XML的基础上构建自己的DSL(Rules
我没有见过类似的内容。正如您所说,您可以托管一种脚本语言,然后简单地阅读启动脚本

当然,使用IOC,您可以部署修改后的DLL并将web.config指向它们,这与此类似,但需要编译(新配置DLL)以检查代码,而不是运行时脚本有运行时错误。但是使用所有IOC容器工作时,运行时错误与静态错误的可能性更大


我猜现在大多数人都把他们的动态风险放在了这两个bucket上——magic config文件可能有细微的错误,magic IOC可能有细微的错误。你的建议是脚本,在它们被解析之前,你不会知道它们是否失败——这是一个稍微不同的地方来进行故障排除——我可以看到不过,好处是。

最终建立了我自己的。本质上,利用App_Code文件夹(它会自动回收应用程序池,从而重新启动应用程序),并在Application_Start事件中使用一些反射来获取实现某个接口/基类的类并运行它们


显而易见的免责声明:在AppDomain中执行随机代码可能是一个安全问题,因为它比修改web.config危险得多,但在受信任的环境中,这非常好。

使用正则表达式来that@Pauli正则表达式在这种情况下会有所帮助,但在结果需要方法调用或扩展strin的情况下则不会您可以在web.config中添加一个包含一些c代码的CData元素要解析文本,请在运行时编译并执行它。对我来说,它似乎是一个混合关注点…web.config定义了要做什么,而不是如何做。@Paul它有点混合关注点,但它更接近真实世界的关注点。例如,通过web.config配置依赖项注入容器可能会很痛苦(例如,当必须调用指定的构造函数并传入值时)而配置文件的后端处理需要大量的字符串解析/反射工作。使用真实的.net对象而不是字符串可以大大简化这一过程。对于只需要字符串和数字的简单内容,web.config很好,但通过它构造复杂的对象并不太好。
IList<TimeZoneInfo> allowedTimeZones =
         System.TimeZoneInfo.GetSystemTimeZones()
           .Where(tz => tz.DisplayName.StartsWith("Central") &&
                  !tz.DisplayName.Contains("Europe"));