【问题标题】:How do I get property injection working in Ninject for a ValidationAttribute in MVC?如何让属性注入在 Ninject 中为 MVC 中的 ValidationAttribute 工作?
【发布时间】:2010-04-29 19:04:53
【问题描述】:

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

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

谢谢!

【问题讨论】:

    标签: asp.net-mvc-2 dependency-injection ninject-2


    【解决方案1】:

    据此post by author of Ninject:

    现场注入:Ninject 2 的注入 现在由表达式树驱动,并且 在 .NET 3.5 中无法设置 带有表达式树的字段值。 由于无论如何这是一个不好的做法,我 决定剪掉它。

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

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

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

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

    【讨论】:

    • 谢谢,服务定位器似乎是要走的路!
    【解决方案2】:

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

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

    [Inject]
    public IRepository<MyType> MyRepo{
        get; set;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-21
      • 2013-03-30
      • 2012-02-18
      • 1970-01-01
      • 1970-01-01
      • 2011-03-14
      • 2016-06-05
      • 1970-01-01
      相关资源
      最近更新 更多