一次性收集所有输入错误并反馈给用户的绝佳方式
ValidationScope 用于在一个上下文中收集所有输入错误,即使验证代码存在于独立的 API 中。
引言
ValidationScope
用于在一个上下文中收集所有输入错误,即使验证代码存在于独立的 API 中。我们不需要显式地返回错误消息并抛出异常。它就像事务上下文由 TransactionScope
管理,我们不需要传递事务实例。它是线程安全的。
ValidationScope
实现了 interface IDisposable
接口,我们可以通过 using 块初始化一个作用域。在一个块中,你可以向作用域添加错误,如果存在错误,using 块的释放会抛出一个包含所有添加错误的异常。ValidationScope
支持嵌套。一个验证作用域及其嵌套作用域共享同一个验证上下文,因此可以编写具有良好验证协调性的独立 API。
背景
ValidationScope
包含在 RapidWebDev
的 CommonLibrary
中。RapidWebDev
是一种基础设施,可以帮助工程师轻松高效地在 Microsoft .NET 中开发企业软件解决方案。它由一个可扩展和可维护的 Web 系统架构以及一套通用的业务模型、API 和服务组成,作为几乎所有业务解决方案开发中所需的基本功能。因此,当工程师在 RapidWebDev 中开发解决方案时,他们可以拥有许多可重用和现成的东西,然后他们可以更多地关注业务逻辑的实现。在实践中,与传统的 ASP.NET 开发相比,我们可以节省 50% 以上的时间来开发高质量和高性能的业务解决方案。
源代码
可以在 RapidWebDev 源码包中找到实现、示例和测试用例的源代码,您可以从官方网站下载。
Using the Code
- 项目:
RapidWebDev.Common
- 命名空间:
RapidWebDev.Common.Validation
ValidationScope
有四个构造函数
ValidationScope()
ValidationScope(Type thrownExceptionType)
ValidationScope(bool forceToThrowExceptionIfHasErrorsWhenDisposing)
ValidationScope(bool forceToThrowExceptionIfHasErrorsWhenDisposing, Type thrownExceptionType)
参数
thrownExceptionType
用于指定在释放时如果记录了错误,则抛出的异常类型。默认情况下,会抛出BaoJianSoft.Common.Validation.ValidationException
。forceToThrowExceptionIfHasErrorsWhenDisposing
为True
时,表示嵌套验证作用域的释放如果存在错误,则直接抛出异常。祖先验证作用域捕获并集成其嵌套作用域中的所有错误,如果它等于False
。
一个简单的使用 ValidationScope
的示例如下。在此 using
块的释放中,会抛出一个包含 2 个错误消息的 InvalidOperationException
实例。如果您没有显式指定 typeof(InvalidOperationException)
,则会抛出一个 ValidationException
实例。
using (ValidationScope scope = new ValidationScope(typeof(InvalidOperationException)))
{
if (true)
scope.Error("Name cannot be empty!");
if (true)
scope.Error("Password cannot be empty!");
}
一个嵌套的验证作用域示例如下。您可以想象 NestedMethod1
和 NestedMethod2
来自独立的 API。在这种情况下,祖先作用域的释放会抛出一个包含所有 5 个错误消息的验证异常。但是,如果您使用 3rd/4th 构造函数并设置 forceToThrowExceptionIfHasErrorsWhenDisposing
为 True
来构造第一个嵌套验证作用域,则抛出的异常仅包含前 3 个错误消息。
public void NestedValidationScopeTest()
{
using (ValidationScope scope = new ValidationScope())
{
scope.Error("Error 1");
NestedMethod1();
NestedMethod2();
}
}
private void NestedMethod1()
{
using (ValidationScope scope = new ValidationScope())
{
scope.Error("Error 2");
scope.Error("Error 3");
}
}
private void NestedMethod2()
{
using (ValidationScope scope = new ValidationScope())
{
scope.Error("Error 4");
scope.Error("Error 5");
}
}
如果记录了错误,您还可以调用验证作用域的 Throw()
方法,该方法会立即在嵌套或祖先作用域中为当前验证作用域抛出一个异常。