Внедрение зависимостей с ModelState - PullRequest
1 голос
/ 11 июля 2019

Во-первых, я знаю, что использование ModelState в сервисе обычно не одобряется, поскольку оно тесно связывает сервис с платформой Mvc. В нашем случае это не проблема, но у меня есть планы по переходу на IValidationDictionary и оболочку ModelState, но сейчас этот шаг нужен, чтобы работать.

Теперь, к вопросу, этот крутой парень прямо здесь:

public class BaseService : IBaseService
    {

      protected MIRTContext _context;
      protected IMapper _mapper;
      //TODO: This tightly couples .NET MVC to our services. 
      // Could be imporoved with an interface and a ModelState wrapper
      // in order to decouple.
      private ModelStateDictionary _modelState;

      public BaseService(
        MIRTContext context, 
        IMapper mapper,
        ModelStateDictionary modelState
      ) {
        _context = context;
        _mapper = mapper;
        _modelState = modelState;
      }

     async Task<bool> IBaseService.SaveContext() {
        if(_modelState.IsValid) {
          try {
            await _context.SaveChangesAsync();
            return true;
          }
          catch {
            return false;
          }
        }
        else {
          return false;
        }
      }
    }

Он продолжает выдавать мне эту ошибку:

Не удается разрешить службу для типа «Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary» при попытке активации

Я предполагаю, что мне не хватает какой-то вещи AddSingleton в моих ConfigureServices в Startup.cs, но я не могу понять, что именно. Кто-нибудь знает, как заставить это сделать инъекцию зависимости?

1 Ответ

2 голосов
/ 11 июля 2019

ModelState недоступен через внедрение зависимостей, но вы можете использовать IActionContextAccessor, который обеспечивает доступ к текущим ActionContext и ModelState собственность.

Сначала вам нужно зарегистрироваться IActionContextAccessor для DI:

services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();

Затем обновите класс BaseService, чтобы использовать его:

public class BaseService : IBaseService
{
    // ...

    private readonly IActionContextAccessor _actionContextAccessor;

    public BaseService(
        // ...
        IActionContextAccessor actionContextAccessor
    ) {
        // ...
        _actionContextAccessor = actionContextAccessor;
    }

    async Task<bool> IBaseService.SaveContext() {
        var actionContext = _actionContextAccessor.ActionContext;

        if (actionContext.ModelState.IsValid) {
            // ...
        }
        else {
            return false;
        }
    }
}

Обратите внимание, что actionContext выше будет null, если вызов SaveContext находится вне MVC и его контроллеров, фильтров и т. Д.

...