Как вы используете метод инъекций с Ninject? - PullRequest
5 голосов
/ 03 ноября 2010

У меня есть класс, который должен использовать IRepository для одного метода в своем классе.

В идеале, я бы хотел избежать разрешения этой зависимости в конструкторе класса, и поэтому я нашел внедрение уровня методав Ninject и было интересно, как это работает?

Я понимаю, как его настроить.Что меня смущает, так это как это назвать?

Пример:

class SomeClassThatUsesRepository
{
    [Inject]
    public void QueryForSomeStuff(IRepository repository)
    {
        //do some stuff
    }
}

Моя проблема в том, как мне вызвать этот метод без указания IRepository?

var someClass = Kernel.Resolve<SomeClassThatUsesRepository>();

сработало бы, если бы я использовал конструктор, но я хочу вызвать метод.

Как вызвать метод с использованием инъекции метода Ninject?

Ответы [ 2 ]

13 голосов
/ 04 ноября 2010

Боюсь, что внедрение метода не работает таким образом - это всего лишь один из способов внедрения зависимостей в объект во время его создания (вы можете внедрить свои зависимости через параметры конструктора, через свойства, поля или методы).Внедрение метода полезно, если ваш класс получает свои зависимости с помощью методов установки в стиле Java, таких как

public void SetRepository(IRepository repository) { ... }

Если он помечен атрибутом [Inject], вам не нужно напрямую вызывать эти методы, этобудет вызван Ninject во время инициализации для передачи объекта IRepository в ваш разрешенный объект.

Поэтому я считаю, что ваш QueryForSomeStuff метод вызывается, когда вы восстанавливаете свой SomeClassThatUsesRepository.

0 голосов
/ 17 апреля 2017

Подтверждено, что внедрение метода не работает должным образом. Получил пользовательский класс атрибута MVC и хотел использовать внутри него внедренный объект. Не прошел в конструктор и добавили метод

[Ninject.Inject]
public void ResolveDI(ISettingStore store)
{
    ConfigHelper = store;
}

Этот метод никогда не вызывался, и ConfigHelper был нулевым при вызове атрибута OnActionExecuting.

...