參數(shù)有效性驗(yàn)證
應(yīng)用程序的輸入數(shù)據(jù)首先應(yīng)該被檢驗(yàn)是否有效。輸入的數(shù)據(jù)能被用戶或其他應(yīng)用程序提交。在Web應(yīng)用中,通常進(jìn)行2次數(shù)據(jù)有效性檢驗(yàn):包括客戶端檢驗(yàn)和服務(wù)端檢驗(yàn)。客戶端的檢驗(yàn)主要是使用戶有一個(gè)好的用戶體驗(yàn)。 首先最好是在客戶端檢驗(yàn)其表單輸入的有效性并且展示給客戶端的那些字段輸入是無(wú)效的。但是,服務(wù)器端的校驗(yàn)是更關(guān)鍵和不可缺失的(不要只做客戶端檢驗(yàn)而不做服務(wù)器端檢驗(yàn))。
服務(wù)器端的檢驗(yàn)通常是被應(yīng)用服務(wù)(層)執(zhí)行,應(yīng)用服務(wù)(層)中的方法首先檢驗(yàn)數(shù)據(jù)的有效性,然后才使用這些通過(guò)驗(yàn)證的數(shù)據(jù)。ABP的基礎(chǔ)設(shè)施提供了自動(dòng)檢驗(yàn)輸入數(shù)據(jù)有效性的方法。
應(yīng)用服務(wù)(層)方法得到一個(gè)數(shù)據(jù)傳輸對(duì)象(DTO)作為輸入。ABP有一個(gè)IValidate的接口,DTO通過(guò)實(shí)現(xiàn)這個(gè)接口能夠檢驗(yàn)數(shù)據(jù)的有效性。由于IInputDto擴(kuò)展自IValidate,所以你可以直接實(shí)現(xiàn)IInputDto 接口來(lái)對(duì)數(shù)據(jù)傳輸對(duì)象(DTO)檢驗(yàn)其有效性。
使用數(shù)據(jù)注解
ABP提供數(shù)據(jù)注解的特性。假設(shè)我們正在開發(fā)一個(gè)創(chuàng)建任務(wù)的應(yīng)用服務(wù)并且得到了一個(gè)輸入,請(qǐng)看下面示例:
public class CreateTaskInput : IInputDto{ public int? AssignedPersonId { get; set; } [Required] public string Description { get; set; }}在這里,Description 屬性被標(biāo)記為 Required。AssignedPersonId 是可選的。在 System.ComponentModel.DataAnnotations 命名空間中,還有很多這樣的特性 ( 例如: MaxLength, MinLength, RegularExpression 等等 )。
在System.ComponentModel.DataAnnotations 命名空間中,請(qǐng)看Task application service 的實(shí)現(xiàn)
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); }}
正如你所看到的,這里沒有寫任何的數(shù)據(jù)驗(yàn)證性代碼(指對(duì)Description屬性的驗(yàn)證)因?yàn)锳BP會(huì)自動(dòng)去檢驗(yàn)數(shù)據(jù)的有效性。ABP也會(huì)檢驗(yàn)輸入數(shù)據(jù)是否為null。如果為空則會(huì)拋出AbpValidationException 異常。所以你不需要寫檢驗(yàn)數(shù)據(jù)是否為null值的代碼。如果有任何屬性的輸入數(shù)據(jù)是無(wú)效的它也會(huì)拋出相同的異常。
這個(gè)機(jī)制近似于 ASP.NET MVC 的驗(yàn)證功能,注意:這里的應(yīng)用服務(wù)類不是繼承自Controller,它是用在Web應(yīng)用的一個(gè)普通類。
|
新聞熱點(diǎn)
疑難解答
圖片精選