6

是否可以在 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 的引用,这也将编译得非常好。我想要的是构建失败并通知我我错过了参考。

4

7 回答 7

3

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

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

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

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

于 2012-12-01T03:16:12.063 回答
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

看起来相当容易使用。不过,这可能不适用于您的场景,我只是将其用作示例。听起来更像是您想要生成代理类型或其他东西......

于 2012-12-03T16:18:39.083 回答
1

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

http://www.ninject.org/

于 2012-12-04T18:35:01.387 回答
1

Resharper 可以帮助您解决这个问题。

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

在此处输入图像描述

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

于 2012-11-28T16:08:52.647 回答
0

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

于 2012-12-05T12:43:04.023 回答
0

Based on what Philip Daniels said, you might need a post-build step.

Let the project compile so that it can place all the referenced DLLs in its output folder and then have a tool (probably custom written or maybe if there is something on Github or Codeplex) scan the .config file and see if the specified type can be found in the output folder.

If it can't be found, then the tool returns a non-zero return code to indicate to the build process (just make sure it hooks into the build process, you would have to let the ms-project build event capture that error code manually, I think) that it failed with an appropriate error message.

于 2012-12-05T09:56:42.497 回答
0

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

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

于 2012-12-05T13:27:19.110 回答