Во-первых, я знаю, что использование 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;
}
}
}
Он продолжает выдавать мне эту ошибку:
Unable to resolve service for type 'Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary' while attempting to activate
Я предполагаю, что мне не хватает какой-то вещи AddSingleton в моих ConfigureServices в Startup.cs, но я не могу понять, что именно. Кто-нибудь знает, как заставить это правильно вводить зависимость?





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 и его контроллеров, фильтров и т. д.