Какие рамки валидации вы бы порекомендовали для проектов.net?

Какую платформу проверки вы бы порекомендовали использовать для веб-приложения mvc3 .net? Приложение следует шаблону модели предметной области, а модели предметной области находятся в отдельной библиотеке классов?

Тип проверки, которая потребуется, будет... Не нулевой, на основе регулярных выражений и т. Д.

2 ответа

Я хотел бы пойти с FluentValidation, это удивительный проект с открытым исходным кодом

https://github.com/JeremySkinner/FluentValidation

Это одинаково хорошо для базовых и более сложных проверок

Если вам нужен список сбоев (а не по одному исключению за раз), тогда мне нравится блок проверки библиотеки предприятия.

Смотрите презентацию PowerPoint по адресу: http://msdn.microsoft.com/en-us/library/ff650484.aspx

Вы можете подключить большинство основных проверок к вашим объектам POCO. И многие из заранее подготовленных правил могут быть установлены в файле.config.

И вы можете написать свои собственные правила.

Мои правила очень детальны. Они выполняют 1 проверку за раз.

В качестве простого примера: у меня было бы 2 разных правила, чтобы решить, можно ли нанять сотрудника (на основе даты рождения). Одно из правил - указывать дату рождения работника.
Второе правило будет гарантировать, что текущая дата минус дата рождения была больше, чем 18 лет. (или как там было правило).

(Теперь давайте предположим, что у меня есть куча правил). Поэтому после запуска процедур проверки я получаю список всех (недопустимых) ситуаций в списке. Например, если бы я проверял работника, я бы получил список инвалидов.

"Не предоставил LastName"

"Не предоставил FirstName"

"Не предоставил SSN"

вместо "по одному". (выполнение этого "по одному за раз" потребует потенциально многократных проходов, чтобы наконец выяснить обоснованность ваших проверок).

Ниже приведен пример кода. Допустим, кто-то пытался купить книгу с ISBN "ABC123456".

Ниже приведено пользовательское правило, которое проверяет, существует ли эта книга (например, в базе данных вашего продукта). Я думаю, что вы можете следовать. Он будет подключен к объекту poco Book(.cs). (Ни один из "провода вверх" не отображается). Я просто пытаюсь дать вам быстрый пример того, как трудно (или не сложно) создать простое правило.

Когда книга не найдена (используется isbn).... тогда вы видите метод validationResults.AddResult. Вот как вы получаете несколько инвалидов. Вы получите доступ к коллекции позже, когда будете проверять запрос проверки.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

using Microsoft.Practices.EnterpriseLibrary.Validation;
using Microsoft.Practices.EnterpriseLibrary.Validation.Validators;


namespace MyCompany.Applications.MyApplication.BusinessLogic.Validation.MyType1Validations
{
    [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]
    public class BookExistsValidatorAttribute : ValidatorAttribute
    {
        protected override Validator DoCreateValidator(Type targetType)
        {
            return new BookExistsValidator("BookExistsValidatorTag");
        }
    }

    public class BookExistsValidator : Validator<string>
    {

        public BookExistsValidator(string tag) : base("BookExistsValidatorMessageTemplate", tag) { }

        protected override string DefaultMessageTemplate
        {
            get { throw new NotImplementedException(); }
        }

        protected override void DoValidate(string objectToValidate, object currentTarget, string key, ValidationResults validationResults)
        {

            bool bookExists = BookMatchExists(objectToValidate);

            if (!bookExists)
            {
                string msg = string.Format("The Book does not exist.  Your ISBN='{0}'", objectToValidate);
                validationResults.AddResult(new ValidationResult(msg, currentTarget, key, 10001, this)); /* 10001 is just some number I made up */

            }


        }

        private bool BookMatchExists(string isbn)
        {
            bool returnValue = false;

            IBookCollection coll = MyCompany.Applications.MyApplication.BusinessLogic.CachedControllers.BookController.FindAll(); /* Code not shown, but this would hit the db and return poco objects of books*/

            IBook foundBook = (from item in coll where item.ISBN.Equals(book, StringComparison.OrdinalIgnoreCase) select item).SingleOrDefault();

            if (null != foundBook)
            {
                returnValue = true;
            }
            return returnValue;
        }



    }
}
Другие вопросы по тегам