Asp.net mvc 2 如何让属性注入在Ninject中为MVC中的ValidationAttribute工作?

Asp.net mvc 2 如何让属性注入在Ninject中为MVC中的ValidationAttribute工作?,asp.net-mvc-2,dependency-injection,ninject-2,Asp.net Mvc 2,Dependency Injection,Ninject 2,我设置了一个validation属性,需要点击数据库来完成验证。我试着像在项目的其他地方一样设置属性注入,但它不起作用。我错过了哪一步 public class ApplicationIDValidAttribute : ValidationAttribute { [Inject] protected IRepository<MyType> MyRepo; public override bool IsValid(object value) {

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

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);
    }
公共类应用程序验证属性:验证属性
{
[注入]
受保护的IRepository MyRepo;
公共覆盖布尔值有效(对象值)
{   
如果(值==null)
返回true;
int-id;
如果(!Int32.TryParse(value.ToString(),out id))
返回false;
//MyRepo在这里为空,从未被注入
var obj=MyRepo.LoadById(id);
返回值(obj!=null);
}
另外需要指出的是,我已经将Ninject内核设置为注入非公共属性,所以我认为这不是问题所在。我使用的是Ninject 2、MVC 2和Ninject.Web.MVC的MVC 2版本

谢谢!

根据Ninject的说法:

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

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

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

public ApplicationIDValidAttribute()
{
  MyRepo = ServiceLocator.Current.GetInstance<IRepository<MyType>>();
}
公共应用程序验证属性()
{
MyRepo=ServiceLocator.Current.GetInstance();
}
如果您不熟悉Service Locator,可以在上找到有关它的信息。
第二种稍微难一点的方法,并不意味着使用服务定位器。我认为您只需要在repo成员ninject-support-property-injection上使用getter和setter

只要把你的代码改成这个,它就会工作

[Inject]
public IRepository<MyType> MyRepo{
    get; set;
}
[注入]
公开存款MyRepo{
获得;设置;
}

谢谢,服务定位器似乎是最好的选择!