是否有允许您在方法属性中进行通用参数验证的标准框架(可能是企业库的一部分......或 .NET 本身)?
6 回答
Microsoft Enterprise Library 具有 Microsoft.Practices.EnterpriseLibrary.Validation 库/命名空间,允许使用属性进行验证。
Microsoft Code Contracts是 .NET Framework 4.0 CTP 的一部分,可用于早期 .NET Framework 版本作为独立包,允许指定编码假设。这包括指定可以验证参数的前提条件。
用于参数检查的示例是(从代码合同文档中复制):
public Rational(int numerator, int denominator)
{
Contract.Requires(denominator ! = 0);
this.numerator = numerator;
this.denominator = denominator;
}
使用代码契约的好处是它是一个库,将成为未来 .NET Framework 版本的一部分,因此迟早您的应用程序中会减少一个依赖项。
编辑:刚刚注意到您特别要求使用属性进行参数检查的库......代码合同没有。Code Contracts 不使用属性的原因在他们的FAQ中列出:
使用自定义属性的优点是它们根本不会影响代码。然而,使用方法调用的好处远远超过了看似自然的首选属性:
运行时支持:在不依赖二进制重写器的情况下,用属性表示的合约不能在运行时强制执行。这意味着,如果您希望在运行时强制执行先决条件(或其他协定),则需要在代码中复制这些协定,或者在构建过程中包含二进制重写器。Contract.RequiresAlways 既可用作声明性合同,也可用作运行时检查的验证。
需要解析:由于可以与自定义属性一起使用的值是有限的,因此条件最终被编码为字符串。这需要定义一种适用于所有源语言的新语言,需要解析字符串,复制编译器已经拥有的所有功能。
缺乏 IDE 支持:以字符串表示,不支持 Intellisense、类型检查或重构,所有这些都可用于将合约编写为代码。
虽然 Microsoft 代码合同已经发布了一段时间,但它们仍然托管在 MS Research 中,您不能使用配置(app.config/database 等)来打开/关闭甚至更改规则。我的库Bouncer确实提供了声明性规则定义:源代码中的属性或实体类/属性级别的规则的 app.config 条目。该库在 LGPL 下是开源的(您可以在商业产品中自由使用它)。如果您通过 app.config 配置规则,则无需重新编译即可调整规则设置。
ASP.NET(和 ASP.NET MVC)的动态数据允许您使用属性对模型属性进行验证。
您还可以使用postsharp并实现自己的属性进行验证。
这是使用 PostSharp http://dpatrickcaldwell.blogspot.com/2009/03/validate-parameters-using-attributes.html的示例