ASP.NET MVC 5:将存储库注入IValidatableObject

时间:2018-11-14 15:49:48

标签: asp.net-mvc asp.net-mvc-5 ninject ninject.web.mvc

我有一个实现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 :(得分:0)

不是,看来这是不可能的,因为MutableObjectModelBinder类是SelectedFilteringCriteria,它是MVC 5用于根据操作参数创建相应对象(在我的情况下为System.Activator)的类,它使用{{1 }}可能无法使用当前的SelectedFilteringCriteria来解决依赖关系DependencyResolver

一种解决方法可能是在SelectedFilteringCriteria的构造函数中执行此操作:

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

但这可能会导致Service Locator Antipattern。您的选择。