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

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

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

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

Пример:

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

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

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

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

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

2 ответа

Решение

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

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

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

Так что я верю вашему QueryForSomeStuff метод вызывается, когда вы восстанавливаете SomeClassThatUsesRepository,

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

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

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

Другие вопросы по тегам