ASP.NET MVC 5: внедрить репозиторий в объект IValidatableObject - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть класс, который реализует интерфейс IValidatableObject, чтобы проверить входящие данные, введенные пользователем.Проблема в том, что для проверки этих данных мне нужно использовать класс, который реализует шаблон хранилища данных, который находится в другой сборке.Примерно так:

public class SelectedFilteringCriteria : IValidatableObject
{
    private IFiltersRepository _filtersRepository;

    public SelectedFilteringCriteria(IFiltersRepository filtersRepository)
    {
        _filtersRepository = filtersRepository;
    }

    public int? SelectedValue { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        var results = new List<ValidationResult>();

        var valueOk = _filtersRepository.GetFilters().Any(
            filter => filter.Value == SelectedValue
        );

        if (!valueOk)
        {
            results.Add(new ValidationResult("Not good :("));
        }

        return results;
    }
}

Я использую контейнер зависимостей Ninject.Я хотел бы знать, есть ли способ сказать MVC ввести класс репозитория в IValidatableObject, когда он будет создан.

1 Ответ

0 голосов
/ 15 ноября 2018

Нет, кажется, что это невозможно, потому что класс MutableObjectModelBinder, который MVC 5 использует для создания соответствующего объекта (SelectedFilteringCriteria в моем случае) из параметров действия, использует System.Activator вместо разрешения зависимости SelectedFilteringCriteria могут иметь текущее значение DependencyResolver.

Обходным путем для этого может быть сделать это внутри конструктора SelectedFilteringCriteria:

public SelectedFilteringCriteria()
{
    _filtersRepository = DependencyResolver.Current.GetService<IFiltersRepository>();
}

Но это может привести к тому, что Service Locator Antipattern . Ваш выбор.

...