Я думаю, что довольно элегантным способом было бы иметь метод validate в вашем сервисе, который возвращает словарь ошибок модели из бизнес-логики. Таким образом, не происходит внедрения ModelState в службу - служба просто выполняет проверку и возвращает любые ошибки. Затем контроллер должен объединить эти ошибки ModelState обратно в его ViewData.
Таким образом, метод проверки сервиса может выглядеть следующим образом:
public IDictionary<string, string> ValidatePerson(Person person)
{
Dictionary<string, string> errors = new Dictionary<string, string>();
// Do some validation, e.g. check if the person already exists etc etc
// Add model erros e.g.:
errors.Add("Email", "This person already exists");
}
И затем вы можете использовать метод расширения в вашем контроллере для отображения этих ошибок в ModelState, что-то вроде:
public static class ModelStateDictionaryExtensions
{
public static void Merge(this ModelStateDictionary modelState, IDictionary<string, string> dictionary, string prefix)
{
foreach (var item in dictionary)
{
modelState.AddModelError((string.IsNullOrEmpty(prefix) ? "" : (prefix + ".")) + item.Key, item.Value);
}
}
}
И ваш контроллер будет использовать:
ModelState.Merge(personService.ValidatePerson(person), "");