Я изучаю использование FluentValidation, поскольку он кажется элегантным API для проверки моих ViewModels при привязке модели. Я ищу мнения о том, как правильно централизовать проверку, используя эту библиотеку, а также на уровне моего бизнеса (службы) и поднимите ее до представления, не имея двух разных подходов к добавлению ошибок модели.ASP.NET MVC FluentValidation с проверкой ViewModels и бизнес-логикой
Я открыт для использования совершенно другого API, но в основном ищет решение этой стратегии валидации ветвления.
[Замечание: Одна вещь, которую я пробовал, состояла в том, чтобы переместить мой бизнес-метод в собственный класс RsvpViewModelValidator своего FluentValidation и использовать метод .Must, но было бы неправильно скрывать этот вызов там, потому что, если мне нужно было фактически использовать объект Customer они мне придется повторно запросить его еще раз, так как его из сферы]
Пример кода:
[HttpPost]
public ActionResult AcceptInvitation(RsvpViewModel model)
{
//FluentValidation has happened on my RsvpViewModel already to check that
//RsvpCode is not null or whitespace
if(ModelState.IsValid)
{
//now I want to see if that code matches a customer in my database.
//returns null if not, Customer object if existing
customer = _customerService.GetByRsvpCode(model.RsvpCode);
if(customer == null)
{
//is there a better approach to this? I don't like that I'm
//splitting up the validation but struggling up to come up with a
//better way.
ModelState.AddModelError("RsvpCode",
string.Format("No customer was found for rsvp code {0}",
model.RsvpCode);
return View(model);
}
return this.RedirectToAction(c => c.CustomerDetail());
}
//FluentValidation failed so should just display message about RsvpCode
//being required
return View(model);
}
[HttpGet]
public ActionResult CustomerDetail()
{
//do work. implementation not important for this question.
}
Вы можете извлечь такое решение на сервисный уровень, но я думаю, что вы ищете белого слона. Не путайте логику бизнеса/процесса с логикой проверки; модель может быть _valid_, без ее значительного смысла в базе данных. –
Я согласен с вашим заявлением о различиях в логике. Думаю, мне интересно ... вы думаете, что код, который у меня выше, правильный или вы подойдете к другому? Мой вопрос довольно широко раскрыт «Что бы вы сделали» с точки зрения получения сообщений обратно в представление для валидации и бизнес-логики вместе. Код выше - лучший подход, который я мог бы подумать, чтобы уйти. – Scott
Я всегда работаю с N-Tier, поэтому у меня бы получилось 'приглашение.Accept() '(или какой-то сервис будет описывать процесс), который либо прошел, либо не удался, и именно там будет размещена логика, но без службы следующее лучшее место находится в контроллере. лично я бы сказал, что вы сделали все, что было возможно, учитывая обстоятельства. –