是否可以创建强类型的web.config引用?

时间:2012-11-23 08:45:26

标签: .net configuration

是否可以在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和OtherProject.WhizzBangers的引用,这也将完全编译。我想要的是构建失败并通知我我错过了参考文献。

7 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:2)

两点:

首先,即使参考文献丢失,您的项目如何编译?这意味着你真的不需要它们!如何对不需要的东西进行强类型引用?当你错过不必要的引用时,你会被要求发出警告吗?

其次,

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

与使用工具添加它们时,Visual Studio生成类来表示资源或属性的方式类似。例如,如果你去Project - &gt;在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

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

答案 2 :(得分:1)

Resharper可以帮助你。

它在视觉上区分web.config中没有引用类型的东西(或者你犯了一个错误 - 在这个例子中,我从“Microsoft”的末尾拿了一个“t”)

enter image description here

然而,它仍然无法编译,这是一种耻辱。它应该!

答案 3 :(得分:1)

我建议你选择使用某种IoC系统。 Microsoft已经提供了Unity Framework,它将比您正在尝试的此解决方案更好地工作。 Ninject也很不错。

http://www.ninject.org/

答案 4 :(得分:0)

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

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

如果找不到,那么该工具返回一个非零返回码来指示构建过程(只是确保它挂钩到构建过程中,你必须让ms-project构建事件捕获那个错误代码手动,我认为它失败并带有相应的错误消息。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

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