代码之家  ›  专栏  ›  技术社区  ›  jaltiere

如何让属性注入在ninject中为MVC中的validationattribute工作?

  •  3
  • jaltiere  · 技术社区  · 15 年前

    我已经设置了一个验证属性,需要在其中点击数据库来完成验证。我试着像在项目的其他地方一样设置属性注入,但它不起作用。我错过了什么步骤?

    public class ApplicationIDValidAttribute : ValidationAttribute
    {
        [Inject]
        protected IRepository<MyType> MyRepo;
    
        public override bool IsValid(object value)
        {   
           if (value == null)
             return true;
    
           int id;
           if (!Int32.TryParse(value.ToString(), out id))
             return false;
    
           // MyRepo is null here and is never injected
           var obj= MyRepo.LoadById(id);
           return (obj!= null);
        }
    

    还有一点需要指出,我已经设置了Ninject内核来注入非公共属性,所以我不认为这是问题所在。我正在使用ninject 2、mvc 2和ninject.web.mvc的mvc 2版本。

    谢谢!

    2 回复  |  直到 15 年前
        1
  •  2
  •   miensol    15 年前

    根据这个 post 通过 author Ninject:

    现场注入:Ninject 2_s注入 现在由表达式树驱动,并且 在.NET 3.5中,无法设置 具有表达式树的字段值。 既然这是一个坏习惯,我 决定剪掉它。

    其次,据我所知,在MVC2中,默认的属性不是通过控制容器的反转来构造的,所以即使Ninject支持字段注入,这仍然不起作用。

    一个简单的解决方案是在属性构造函数中使用servicelocator,如下所示:

    public ApplicationIDValidAttribute()
    {
      MyRepo = ServiceLocator.Current.GetInstance<IRepository<MyType>>();
    }
    

    如果您不熟悉服务定位器,可以在 codeplex . 第二种稍难的方法,并不意味着使用服务定位器。 here .

        2
  •  1
  •   richard hartz    12 年前

    我认为您只需要一个repo成员的getter和setter,ninject支持属性注入

    只要把代码改成这个,它就可以工作了。

    [Inject]
    public IRepository<MyType> MyRepo{
        get; set;
    }
    
    推荐文章