Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 是否可以创建强类型的web.config引用?_.net_Configuration - Fatal编程技术网

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

.net 是否可以创建强类型的web.config引用?,.net,configuration,.net,Configuration,是否可以在web.config或app.config中创建强类型引用,以便在尚未将这些类型引用添加到项目中时生成将中断 例如,假设我有一个WhizzBangerFactory,它在web.config中查找声明的WhizzBangers。我可能有这样的配置 <whizBangs> <add name="SuperDooper" type="MyProject.WhizzBangers.SuperDooperWhizzBanger, MyProject.WhizzBangers"

是否可以在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和另一个project.WhizzBangers的引用,这也会编译得非常好。我希望构建失败,并通知我错过了引用。

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

它可以直观地区分web.config中未引用类型的内容(或者您犯了一个错误-在本例中,我在“Microsoft”的末尾去掉了一个“t”)


然而,它仍然没有编译失败,这是一个遗憾。应该的

web.config是仅运行时解析。推迟建造成功或失败

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

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

另一种方法是(在生成中包含引用所有可能需要的类型的另一个项目,创建该类型的实例以使编译器不会优化),并将此项目添加为web项目的依赖项。这样,如果类型项目失败,则web生成项目也会失败。有两点:

首先,即使缺少引用,您的项目如何编译?这意味着您并不真正需要它们!您如何能够拥有对不需要的内容的强类型引用?您要求在错过不必要的引用时得到警告

第二,

我仍然不清楚您到底想要做什么,但我认为您想要的可以通过创建一个预构建步骤来实现。您可能需要编写一个小小的C#console程序来处理和检查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自动生成
//通过诸如ResGen或Visual Studio之类的工具初始化。
//要添加或删除成员,请编辑.ResX文件,然后重新运行ResGen
//使用/str选项,或重建VS项目。
听起来您可能可以在项目中执行类似的操作,也许可以添加一个为您生成类的预构建步骤

StronglyTypedResourceBuilder类在此处有一个参考页:


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

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


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

让项目进行编译,以便将所有引用的DLL放在其输出文件夹中,然后使用工具(可能是自定义编写的,或者可能是Github或Codeplex上有内容)扫描.config文件,查看是否可以在输出文件夹中找到指定的类型


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

创建Msbuild步骤,方法是创建或使用,该步骤将解析web.config中的类名,并尝试使用加载。如果加载失败,将引发异常,该异常将使生成失败。

是否可以尝试编写将使用此配置的单元测试并将测试作为构建的一部分进行集成?这将给出正确的指标,表明即使在自动化构建系统中,某些测试也会失败,并帮助您发现问题


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

我想知道是否可以使用工具实现这一点例如Resharper?创建一个可执行文件,通过解析.config文件或其他方式检查您需要的内容。从预构建事件调用此可执行文件。但这就是rue sharper不能用于自动构建失败的原因。我认为这可能是最好的主意,我猜如果不可能从web.config中获得编译时错误,那么然后键入一个diff