Как заставить внедрение свойства работать в Ninject для атрибута ValidationAttribute в MVC? - PullRequest
3 голосов
/ 29 апреля 2010

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

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 ]

2 голосов
/ 03 мая 2010

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

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

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

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

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

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

1 голос
/ 11 февраля 2013

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

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

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