返回总目录


本篇目录

验证介绍###

首先应该验证应用的输入。用户或者其它应用都可以向该应用发送输入。在一个web应用中,验证通常要实现两次:在客户端和服务器端。客户端的验证大多数情况下是为用户体验而实现的。在客户端最好先检查一下表单,并向用户展示不合法的字段。但是服务端的验证更关键且不可避免。

服务端的验证通常实现在应用服务层。应用服务方法应首先检查(验证)输入然后再使用它。ABP提供了一个很好的基础设施来验证应用服务方法的输入。

应用服务方法接收一个DTO(数据传输对象)作为输入。ABP有一个IValidate接口,凡是实现了该接口的DTO都可以自动地进行验证。因为IInputDto继承了IValidate,因此只要为输入DTOs实现IInputDto就可以确保验证了。

使用数据注解###

ABP支持数据注解特性。假设我们要开发一个任务(Task)应用服务,该服务用于创建一个任务,它的输入参数类型如下所示:

public class CreateTaskInput : IInputDto
{
public int? AssignedPersonId { get; set; } [Required]
public string Description { get; set; }
}

这里,Description属性标记为 Required。AssignedPersonId是可选的。在 System.ComponentModel.DataAnnotations命名空间中也有很多特性(如MaxLength,MinLength,RegularExpression等等)。来看一下任务应用服务的实现:

public class TaskAppService : ITaskAppService
{
private readonly ITaskRepository _taskRepository;
private readonly IPersonRepository _personRepository; public TaskAppService(ITaskRepository taskRepository, IPersonRepository personRepository)
{
_taskRepository = taskRepository;
_personRepository = personRepository;
} public void CreateTask(CreateTaskInput input)
{
var task = new Task { Description = input.Description }; if (input.AssignedPersonId.HasValue)
{
task.AssignedPerson = _personRepository.Load(input.AssignedPersonId.Value);
} _taskRepository.Insert(task);
}
}

正如你所看到的,这里没写验证代码,因为ABP会自动进行验证。ABP也会检查输入是否为null。如果为null,就会抛出 AbpValidationException。因此,你也不用写检测null的代码(保卫语句)。如果输入的属性有任何一个是非法的,那么就会抛出相同的异常。

该机制和ASP.NET MVC的验证相似,但是注意的是应用服务类不是派生自Controller,而只是一个纯粹的类并且在web应用之外工作。

自定义验证###

如果数据注解还不能满足你的情况,那么你可以实现ICustomValidate接口,如下所示:

public class CreateTaskInput : IInputDto, ICustomValidate
{
public int? AssignedPersonId { get; set; } public bool SendEmailToAssignedPerson { get; set; } [Required]
public string Description { get; set; } public void AddValidationErrors(List<ValidationResult> results)
{
if (SendEmailToAssignedPerson && (!AssignedPersonId.HasValue || AssignedPersonId.Value <= 0))
{
results.Add(new ValidationResult("AssignedPersonId must be set if SendEmailToAssignedPerson is true!"));
}
}
}

ICustomValidate接口声明了要实现的AddValidationErrors方法。这里,我们有一个 SendEmailToAssignedPerson属性。如果它的值是true, 而且没有提供AssignedPersonId或值是负数,那么我们就认为这里发生了验证错误,我们必须将ValidationResult对象添加到 results集合中。

标准化###

我们可能在验证之后执行一个额外的操作来排列DTO参数。ABP定义了IShouldNormalize接口, 该接口中定义了Normalize方法来达到排列DTO参数的目的。如果你实现了该接口,那么就应该在验证之后(方法调用之前)调用Normalize方法。假如我们的DTO要有一个排序(Sorting)方向,如果没有提供的话,我们就要设置一个默认值:

public class GetTasksInput : IInputDto, IShouldNormalize
{
public string Sorting { get; set; } public void Normalize()
{
if (string.IsNullOrWhiteSpace(Sorting))
{
Sorting = "Name ASC";
}
}
}

ABP理论学习之验证DTO的更多相关文章

  1. ABP理论学习之数据传输对象(DTO)

    返回总目录 本篇目录 为何需要DTO 领域层抽象 数据隐藏 序列化和懒加载问题 DTO惯例和验证 DTO和实体的自动映射 使用特性和扩展方法进行映射 帮助接口 DTO用于应用层和 展现层间的数据传输. ...

  2. ABP(现代ASP.NET样板开发框架)系列之18、ABP应用层——权限验证

    点这里进入ABP系列文章总目录 ABP(现代ASP.NET样板开发框架)系列之18.ABP应用层——权限验证 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目 ...

  3. ABP理论学习之Javascript API(理论完结篇)

    返回总目录 本篇目录 Ajax Notification Message UI block和busy 事件总线 Logging 其他工具功能 说在前面的话 不知不觉,我们送走了2015,同时迎来了20 ...

  4. ABP应用层——权限验证

    ABP应用层——权限验证 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ABP的官方网站:http://www.aspnetboilerpla ...

  5. ABP理论学习之N层架构

    返回总目录 自从写这个系列博客之后,发现很多园友还是希望有个直接运行的demo,其实在github上就有官方的demo,我直接把这demo的链接放到这里吧,另外,我分析,这些找不到demo的同学,很可 ...

  6. ABP理论学习之应用服务

    返回总目录 本篇目录 IApplicationService接口 ApplicationService类 工作单元 数据库连接和事务管理 自动保存更改 更多 应用服务的生命周期 应用服务用于将领域逻辑 ...

  7. ABP理论学习之开篇介绍

    返回总目录 为了和2016年春节赛跑,完成该系列博客,我牺牲了今天中午的时间来完成该系列的第一篇----开篇介绍.开篇介绍嘛,读过大学教材的同学都知道,这玩意总是那么无聊,跟考试没关系,干脆直接跳过, ...

  8. ABP理论学习之领域服务

    返回总目录 本篇目录 介绍 IDomainService接口和DomainService类 样例 创建一个接口 服务实现 调用应用服务 一些讨论 何不只使用应用服务 如何强制使用领域服务 介绍 领域服 ...

  9. ABP理论学习之异常处理

    返回总目录 本篇目录 介绍 开启错误处理 非Ajax请求 展示异常信息 UserFriendlyException Error模型 Ajax请求 异常事件 介绍 在一个web应用中,异常通常是在MVC ...

随机推荐

  1. tmpfs详解

    一,tmpfs介绍 1. tmpfs是一种虚拟内存文件系统,正如这个定义它最大的特点就是它的存储空间在VM里面(什么是VM?后面介绍) 2. VM是由linux内核里面的vm子系统管理的东西,现在大多 ...

  2. java的remote shell

    http://www.ganymed.ethz.ch/ssh2/ 此程序的目的是执行远程机器上的Shell脚本. [环境参数] 远程机器IP:172.17.24.212 用户名:root 密码:zhe ...

  3. Java集合框架练习-计算表达式的值

    最近在看<算法>这本书,正好看到一个计算表达式的问题,于是就打算写一下,也正好熟悉一下Java集合框架的使用,大致测试了一下,没啥问题. import java.util.*; /* * ...

  4. Mac下golang开发环境配置

    go语言在开发效率和运行效率中的优势让很多人青睐,所以有倾向打算转向go语言的开发. 下面介绍在Mac OS X中golang的开发环境配置. 1.安装brew brew是一个mac下的由ruby开发 ...

  5. 将 xunit.runner.dnx 的 xml 输出转换为 Nunit 格式

    由于目前 DNX 缺乏 XSLT 的转换能力,因此只能使用变通方法.具体参考这个链接 主要内容复制过来是: From @eriklarko on July 14, 2015 7:38 As a wor ...

  6. java 读写properties (配置)文件

    Properties属性文件在Java应用程序中是经常可以看得见的,也是特别重要的一类文件.它用来配置应用程序的一些信息,不过这些信息一般都是比较少的数据,没有必要使用数据库文件来保存,而使用一般的文 ...

  7. 【iOS 使用github上传代码】详解

    [iOS 使用github上传代码]详解 一.github创建新工程 二.直接添加文件 三.通过https 和 SSH 操作两种方式上传工程 3.1https 和 SSH 的区别: 3.1.1.前者可 ...

  8. 记一次在java中的日期parse错误

    String dateString = "2014101517"; new SimpleDateFormat("yyyyMMddHH").parse(dateS ...

  9. selenium获取Cookie操作

    直接贴代码: Set cookies = dr.manage().getCookies(); for (Cookie cookie : cookies) { System.out.println(&q ...

  10. C++-Qt【4】-CheckBox on QListView

    引用:http://www.qtcentre.org/threads/47119-checkbox-on-QListView QListWidgetItem *item = new QListWidg ...