Я создал интерфейс:
public interface IModelStateWrapper
{
void AddModelError(string name, string error);
}
Затем я создал реализацию для каждого контроллера:
public class ControllerModelStateWrapper : IModelStateWrapper
{
private ModelStateDictionary _dictionary;
public ControllerModelStateWrapper(ModelStateDictionary dictionary)
{
_dictionary = dictionary;
}
public void AddModelError(string name, string error)
{
if (_dictionary[name] == null)
_dictionary.Add(name, new ModelState());
_dictionary[name].Errors.Add(error);
}
}
Каждый сервис реализует:
public interface IModelWrapperService
{
IModelStateWrapper ModelWrapper {get;set;}
}
А потом я установил его в контроллере:
public UserController(IUserService service)
{
_service.ModelWrapper = new ControllerModelStateWrapper(ModelState);
}
IModelStateWrapper - не лучшее имя, поскольку этот интерфейс может работать не только с Controller.ModelState. Работает довольно хорошо. Вы можете легко заменить IModelStateWrapper на макет или другую реализацию в своих сервисных тестах. Это решение также автоматически устанавливает ModelState как недействительный.