Вопрос инъекций - PullRequest
       25

Вопрос инъекций

6 голосов
/ 03 ноября 2010

У меня вопрос по шаблону внедрения зависимостей. Мой вопрос ... Если я перейду к инжектору конструктора, введя зависимости для моего класса, то получу «большой» конструктор со многими параметрами. Что если то есть Я не использую некоторые параметры в некоторых методах? То есть. У меня есть сервис, который выставляет много методов. И конструктор с 10 параметрами (все зависимости). Но не все методы используют все зависимости. Один метод будет использовать только одну зависимость, другой будет использовать 3 зависимости. Но DI-контейнер разрешит их все, даже если не используются.

Для меня это снижение производительности при использовании DI-контейнера. Это правда?

Ответы [ 5 ]

7 голосов
/ 03 ноября 2010

Кажется, ваш класс многое делает, что он не соответствует S в SOLID (принцип единой ответственности), возможно, вы могли бы разделить класс на несколько меньших классов с меньшим количеством зависимостей.Тот факт, что не все зависимости используются всеми методами, говорит об этом.

1 голос
/ 03 ноября 2010

Обычно снижение производительности при внедрении многих зависимостей невелико, но это зависит от выбранной вами платформы. Некоторые скомпилируют методы для этого на лету. Вам придется проверить это. Многие зависимости указывают на то, что ваш класс делает слишком много (как сказал Рубен), так что вы можете взглянуть на это. Если создание экземпляра зависимости, которую вы часто не используете, вызывает проблемы с производительностью, вы можете захотеть представить фабрику как зависимость. Я обнаружил, что использование фабрик может решить многие проблемы, связанные с использованием фреймворков внедрения зависимостей.

// Constructor
public Consumer(IContextFactory contextFactory)
{
    this.contextFactory = contextFactory;
}

public void DoSomething()
{
    var context = this.contextFactory.CreateNew();
    try
    {
        // use context here

        context.Commit();
    }
    finally
    {
        context.Dispose();
    }
}
0 голосов
/ 03 ноября 2010

Как говорит Рубе, вероятно, вам следует пересмотреть дизайн своего класса, чтобы придерживаться принципов SOLID.

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

0 голосов
/ 03 ноября 2010

Вы также можете скрыть некоторые пока не нужные зависимости за ленивыми провайдерами. Например:

public DataSourceProvider implements Provider<DataSource> {

    public DataSource get() {
         return lazyGetDataSource();
    }

}

Интерфейс провайдера является частью javax.inject пакета.

0 голосов
/ 03 ноября 2010

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

...