【问题标题】:Is it possible to create strongly typed web.config references?是否可以创建强类型的 web.config 引用?
【发布时间】:2012-11-23 08:45:25
【问题描述】:

是否可以在 web.config 或 app.config 中创建强类型引用,以便在尚未将这些类型引用添加到项目中时构建会中断?

例如,假设我有一个 WhizzBangerFactory,它在 web.config 中查找已声明的 WhizzBangers。我可能有类似的配置,

<whizBangs>
<add name="SuperDooper" type="MyProject.WhizzBangers.SuperDooperWhizzBanger, MyProject.WhizzBangers" />
<add name="Fantastical" type="AnotherProject.WhizzBangers.FantasticalWhizzBanger, AnotherProject.WhizzBangers" />
</whizBangs>

即使没有对 MyProject.WhizzBangers 和AnotherProject.WhizzBangers 的引用,它也能完美编译。我想要的是构建失败并通知我我错过了参考。

【问题讨论】:

  • 不知道用Resharper之类的工具能不能做到?
  • 创建一个可执行文件,通过解析您的 .config 文件或其他方式来检查您需要的内容。从 Pre-build 事件调用这个可执行文件。

标签: .net configuration


【解决方案1】:

web.config 是仅运行时解析。为构建成功或失败而迟到。

如果相同的构建构建了 web.config 中引用的类型,请解析 web.config 文件以验证所有文件是否存在(这将要求网站所需的所有二进制文件都以一个公共文件结尾目录。对于像 tfs 这样的东西,这将作为编译后步骤完成,只有成功时才会将二进制文件复制到放置目录,否则构建失败

如果其他类型由另一个构建提供并作为安装程序的一部分包含在内,则可以将相同类型的配置文件解析作为独立应用程序(安装的一部分)运行作为健全性检查

另一种方式(将在您的构建中包含另一个项目,该项目引用您可能需要的所有类型,创建该类型的实例以便编译器不会优化)并将此项目添加为您的网络的依赖项项目。这样,如果类型项目失败,那么 Web 构建项目也会失败

【讨论】:

  • 谢谢,这是有道理的 - 正如 Rafa 所建议的那样,也许更好的主意是不使用 web.config 来解决问题并查看其他解决方案,例如 IOC。
【解决方案2】:

两点:

首先,即使引用丢失,您的项目如何编译?这意味着您实际上并不需要它们!你怎么能有一个你不需要的东西的强类型引用?当您错过了一个不必要的引用时,您要求得到警告?

其次,

我仍然不清楚你想要做什么,但我认为你想要的可以通过创建一个预构建步骤来实现。您可能需要编写一个小 C# 控制台程序来处理和检查 web.config 文件。

这类似于 Visual Studio 生成一个类来表示您的资源或属性(如果您使用工具添加它们)的方式。例如,如果您转到 Project -> Properties, Resources 选项卡,然后创建一个资源,您会发现 Visual Studio 会生成一个 Resources.Designer.cs 文件,其中包含一个类,您可以在代码中将其引用为

Properties.Resources.MyTestResource

有趣的是,生成的代码里面是这个注释

/// <summary>
///   A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.

听起来您可以在您的项目中做类似的事情,也许是通过添加一个为您生成类的预构建步骤?

StronglyTypedResourceBuilder 类在这里有一个参考页面:

http://msdn.microsoft.com/en-us/library/system.resources.tools.stronglytypedresourcebuilder.aspx

看起来相当容易使用。不过,这可能不适用于您的场景,我只是将其用作示例。听起来更像是你想生成一个代理类型什么的……

【讨论】:

    【解决方案3】:

    Resharper 可以帮助您。

    它在视觉上区分了 web.config 中未引用类型的内容(或者你犯了一个错误 - 在这个例子中,我在“Microsoft”的末尾加上了一个“t”)

    但是,它仍然没有编译失败,这是一个耻辱。应该的!

    【讨论】:

    • 但这就是 rue sharper 不能用于在自动构建中失败
    【解决方案4】:

    我建议您作为替代方案来使用某种 IoC 系统。 Microsoft 已经提供了 Unity 框架,它会比您尝试的这个解决方案更好。 Ninject 也不错。

    http://www.ninject.org/

    【讨论】:

    • 我认为这可能是最好的主意,我想如果无法从 web.config 中获取缺少类型的编译时错误,那么不同的解决方案将是有意义的。
    【解决方案5】:

    根据 Philip Daniels 所说,您可能需要一个后期构建步骤。

    让项目编译,以便它可以将所有引用的 DLL 放在其输出文件夹中,然后有一个工具(可能是自定义编写的,或者如果 Github 或 Codeplex 上有东西)扫描 .config 文件并查看指定的类型可以在输出文件夹中找到。

    如果找不到,则该工具返回一个非零返回码以指示构建过程(只需确保它挂钩到构建过程,您必须让 ms-project 构建事件捕获我认为手动错误代码)它失败并显示适当的错误消息。

    【讨论】:

      【解决方案6】:

      通过创建new Task implementation 或使用Inline Task 来执行Msbuild 步骤,它会解析web.config 中的类名并尝试使用Assembly.Load 加载它们。如果加载失败,它会抛出一个异常,这将使你的构建失败。

      【讨论】:

        【解决方案7】:

        您能否尝试编写一个单元测试来使用此配置并将测试集成为构建的一部分?这将给出正确的指示,即使在自动构建系统中某些测试也失败了,并帮助您发现问题。

        或者您可以尝试将 whizBangs 配置放在单独的配置文件中,并在 web.config 中提及源代码。保存此单独的配置文件后,您可以调用 customtool(VS 中已经提供的自定义工具的工具),它将自动生成一个形成配置文件的类表示的 cs 文件。可以使用由自定义工具生成的适当 cmets 签入此 cs 文件,以指示其用途。每当开发人员更改此文件并保存时,config 和 cs 文件都会被检出和编辑。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-11
          • 1970-01-01
          • 1970-01-01
          • 2020-04-20
          相关资源
          最近更新 更多