Острая архитектура; Доступ к результатам проверки - PullRequest
1 голос
/ 13 мая 2010

Я изучаю архитектуру Sharp и хотел бы узнать, как получить доступ к результатам проверки после вызова Entity.IsValid (). У меня есть два сценария, например

1) Если entity.IsValid () возвращает false, я хотел бы добавить ошибки в коллекции ModelState.AddModelError () в моем контроллере.

например. в примере Northwind у нас есть EmployeesController.Create () действие, когда мы делаем employee.IsValid (), как я могу получить доступ к ошибки

public ActionResult Create(Employee employee) { 
  if (ViewData.ModelState.IsValid && employee.IsValid()) { 
    employeeRepository.SaveOrUpdate(employee); 
  } 
  // ....
}

[Я уже знаю, что когда вызывается метод Action, связыватель моделей применяет правила валидации (атрибуты валидатора nhibernate), так как анализирует входящие значения и пытается присвоить их объекту модели и если он не может проанализировать входящие значения, он регистрирует их как ошибки в состоянии модели для каждого свойства объекта модели. Но что если я есть некоторые пользовательские проверки. Вот почему мы делаем ModelState.IsValid первый.]

2) В моих тестовых методах я хотел бы проверить валидацию nhibernate правила тоже. Я могу сделать entity.IsValid (), но это только возвращает true / ложный. Я хотел бы утверждать против фактической ошибки, а не только правда / ложь.

В моих предыдущих проектах я обычно использую сервисный слой-оболочку для Репозитории, и вместо вызова метода Репозитории напрямую из контроллер, контроллеры вызывают методы уровня обслуживания, которые в свою очередь вызывают методы хранилища. В моем слое обслуживания все мои собственные правила проверки методы resides и Service Layer выдают пользовательское исключение с NameValueCollection ошибок, которые я могу легко добавить в ModelState в мой контроллер Таким образом, я также могу легко реализовать сложные бизнес-правила в моем слое обслуживания, а также. Я знаю острую архитектуру также предоставляет сервисный уровень проекта. Но что меня интересует и мой следующий вопрос:

Как я могу использовать NHibernate Vaidators для реализации сложных пользовательских бизнес-правила (не просто ноль, пусто, диапазон и т. д.) и сделать Entity.IsValid () для проверки этих правил тоже?

1 Ответ

0 голосов
/ 08 июня 2010

"Как я могу использовать NHibernate Vaidators для реализации сложных пользовательских бизнес-правил (не только null, empty, range и т. Д.) И сделать Entity.IsValid () для проверки этих правил?"

Вы должны создать собственный атрибут проверки:

вот пример:

[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
    public sealed class LoginUniqueAttribute : ValidationAttribute
    {
        private static readonly string DefaultErrorMessage = MUI.LoginNameInUse;

        public LoginUniqueAttribute()
            : base(DefaultErrorMessage)
        {
        }

        public override string FormatErrorMessage(string name)
        {
            return DefaultErrorMessage;
        }

        public override bool IsValid(object value)
        {
            if (string.IsNullOrEmpty((string)value))
            {
                return true;
            }

            var userService = IoC.Resolve<IUserService<User>>();
            return userService.GetByLogins(new[] { (string)value }).Count() == 0;
        }
    }

и используется в UserInput dto

        [Required]
        [LoginUniqueAttribute]
        [RegularExpression("^[A-Za-z0-9.'\\s]+$", ErrorMessage = "Only characters and digits are allowed")]
        [DisplayNameLocalized(typeof(MUI), "LoginName")]
        public string LoginName { get; set; }

также не забудьте инициализировать проверку в вашем файле global.asax.cs на Application_Start:

 private void InitializeValidator()
        {
            var provider = new NHibernateSharedEngineProvider();
            NHibernate.Validator.Cfg.Environment.SharedEngineProvider = provider;
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...