3

我设置了一个验证属性,我需要在其中访问数据库以完成验证。我尝试以与项目其他地方相同的方式设置属性注入,但它不起作用。我错过了什么步骤?

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 版本。

谢谢!

4

2 回答 2

2

根据Ninject的作者的这篇文章:

字段注入:Ninject 2 的注入现在由表达式树驱动,在 .NET 3.5 中无法使用表达式树设置字段值。由于无论如何这是一个不好的做法,我决定削减它。

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

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

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

如果您不熟悉 Service Locator,您可以在codeplex上找到有关它的信息。第二种稍微困难的方法,这并不意味着使用服务定位器在这里描述。

于 2010-05-03T10:30:29.060 回答
1

我认为您只需要在您的 repo 成员上使用 getter 和 setter,ninject 支持属性注入

只需将您的代码更改为此,它应该可以工作。

[Inject]
public IRepository<MyType> MyRepo{
    get; set;
}
于 2013-02-11T12:09:31.080 回答