Как заставить работать инъекцию свойств в Ninject для ValidationAttribute в MVC?

У меня установлен атрибут проверки, где мне нужно попасть в базу данных, чтобы выполнить проверку. Я попытался настроить внедрение свойств так же, как и в других частях проекта, но это не сработало. Какой шаг мне не хватает?

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 и версию MVC 2 Ninject.Web.MVC.

Спасибо!


person jaltiere    schedule 29.04.2010    source источник


Ответы (2)


Согласно этому сообщению автора автор Ninject:

Внедрение поля: внедрение Ninject 2 теперь управляется деревьями выражений, а в .NET 3.5 нет возможности устанавливать значения полей с помощью дерева выражений. Так как это в любом случае плохая практика, я решил ее сократить.

Во-вторых, насколько мне известно, в MVC2 атрибуты по умолчанию не создаются с помощью инверсии контейнера управления, поэтому даже если Ninject будет поддерживать внедрение поля, это все равно не сработает.

Одним из простых решений было бы использовать ServiceLocator в конструкторе атрибутов следующим образом:

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

Если вы не знакомы с Service Locator, вы можете найти информацию о нем на codeplex. Второй немного более сложный подход, который не подразумевает использование Service Locator, описан здесь.

person miensol    schedule 03.05.2010
comment
Спасибо, Service Locator - это то, что вам нужно! - person jaltiere; 03.05.2010

Я думаю, вам просто нужен геттер и сеттер на вашем члене репо, инъекция свойства поддержки ninject

Просто измените свой код на этот, и он должен работать.

[Inject]
public IRepository<MyType> MyRepo{
    get; set;
}
person richard hartz    schedule 11.02.2013