【问题标题】:ASP.NET MVC 5: Inject a repository into an IValidatableObjectASP.NET MVC 5:将存储库注入 IValidatableObject
【发布时间】:2019-04-17 15:27:08
【问题描述】:

我有一个实现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

【问题讨论】:

  • 那么您发布的代码有什么问题?您是否正在寻找如何设置 ninject 内核/绑定以使您的代码成为可能?
  • @GregH 我什至不知道是否有可能让它工作。现在,存储库类在NinjectWebCommon 文件中进行了配置,并且在注入控制器时它可以正常工作,但是我不能让它注入到我发布的类中,主要是因为我没有实例化那个类,它是用传入请求实例化它的 MVC。我想知道如何将它注入我发布的课程中。
  • 听起来您可能会以错误的方式处理此问题。我认为您想将 repo 的接口注入具体类SelectedFilteringCriteria,而您提到尝试将其注入接口IValidatableObject。将你的 repo 接口注入具体类SelectedFilteringCriteria 有什么问题?这就是我一次又一次地看到 DI 完成的方式。我不确定为什么你需要将任何东西注入接口本身。也许更多的上下文会有所帮助
  • 如果你有多个继承自 IValidatableObject 的类并且需要将你的 repo 注入到每个类中,那么创建一个基类,你的 repo 接口被注入,然后让你的其他类从他们那里继承。所以类签名看起来像SelectedFilteringCriteria : BaseCriteria, IValidatableObject,其中 repo 被注入到BaseCriteria,这样所有继承它的类都可以访问你的 repo
  • @GregH 我没有说我想在接口中注入一个类,这很荒谬。好的,简单来说:FiltersRepository 必须通过构造函数注入到SelectedFilteringCriteria 中。考虑到实例化SelectedFilteringCriteria 类的不是我,而是MVC,我该如何实现这一点。总结:这是一个配置问题:如何配置 MVC 和 Ninject 来实现?

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


【解决方案1】:

不,这似乎是不可能的,因为 MutableObjectModelBinder 类是 MVC 5 用来从操作参数创建相应对象(在我的情况下为 SelectedFilteringCriteria)的一个类,它使用 System.Activator 而不是解析SelectedFilteringCriteria 的依赖关系可以使用当前的 DependencyResolver

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

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

但这可能会开车到Service Locator Antipattern。您的选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-12
    • 1970-01-01
    • 2017-04-30
    • 1970-01-01
    • 2011-02-14
    • 2020-01-31
    • 1970-01-01
    相关资源
    最近更新 更多