Я использую шаблон службы / хранилища и проверку, как описано в этого руководства . Службы имеют свойство ValidationDictionary.
public interface IValidationDictionary
{
void AddError(string key, string errorMessage);
bool IsValid { get; }
}
Услуги вводятся в ctor контроллеров. В теле конструктора установлено свойство validationdictioary. Я использую класс-обертку для обтекания состояния модели контроллера.
public AuthenticationController(
IOptionsMonitor<PasswordOptions> optionsAccessor,
AppUserService appUserService,
ILogger<AuthenticationController> logger, IConfiguration config) : base(logger, config)
{
_passwordOptions = optionsAccessor.CurrentValue;
_appUserService = appUserService;
_appUserService.ValidationDictionary = new ModelStateWrapper(ModelState);
}
public class ModelStateWrapper : IValidationDictionary
{
private readonly ModelStateDictionary _modelState;
public ModelStateWrapper(ModelStateDictionary modelstate)
{
_modelState = modelstate;
}
public void AddError(string key, string errorMessage)
{
_modelState.AddModelError(key, errorMessage);
}
public bool IsValid => _modelState.IsValid;
}
В сервисе, когда проверка идет не так, я добавляю ошибку в словарь проверки.
ValidationDictionary.AddError("", ErrorMessages.PasswordIsRequired);
Когда проверочный справочник содержит какие-либо ошибки, исключение DataValidationException вызывается.
if (!ValidationDictionary.IsValid)
{
throw new DataValidationException();
}
Это исключение фиксируется в контроллере для обновления представления с дополнительными ошибками в состоянии модели.
Этот подход хорошо работал в asp.net, но в ядре asp.net он больше не работает.
Когда я проверяю проверку в сервисе, он содержит все ожидаемые ошибки Вернувшись в контроллер после отлова исключения, ModelState находится в исходном состоянии = состояние перед переходом в службу.
Когда я перемещаю присваивание состояния модели в проверочный словарь из конструктора в начало действия. Работает нормально.
public async Task<IActionResult> Register(RegisterVM VM)
{
try
{
_appUserService.ValidationDictionary = new ModelStateWrapper(ModelState);
....
Это очень подвержено ошибкам, поэтому совершенно не желательно.
В качестве обходного пути я добавил свойство для службы только с геттером.
protected AppUserService AppUserService
{
get
{
if (_appUserService.ValidationDictionary == null)
{
_appUserService.ValidationDictionary = new ModelStateWrapper(ModelState);
}
return _appUserService;
}
}
Есть предложения по лучшему решению?