Внедрение зависимостей - выбор аргументов во время выполнения - PullRequest
3 голосов
/ 14 февраля 2012

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

Допустим, у меня есть следующие классы:

class BankAccount
{
    User user;
    Integer accountNo;

    BankAccount(User user, Integer accountNo){
        ....
    }
 }

class User
{
    String firstName, lastName;

    User(String firstName, String lastName)
    {
        ....
    }
}

Допустим, мне нужно создать объекты в следующем сценарии:

void withoutDependecyInjectionUsingNewOperator()
{
     User user = new User("Lance", "Armstrong");
     // These values are determined
     // based on form input on UI
     BankAccount account = new BankAccount(user, 1233);
}

Я познакомился с такими фреймворками, как Guice или Spring, которые поддерживают DI.Если бы я использовал какую-либо из этих платформ, должен ли я изменять указанную выше функцию для использования DI?

На основании примеров, которые я видел в учебниках, кажется, что это в основном полезно, когда аргументы конструктора могутбыть выбранным как конфигурация, а не для случаев, когда значения в конечном счете основаны на вводе пользователем?

Спасибо!

1 Ответ

1 голос
/ 14 февраля 2012

Судя по тому, что вы опубликовали, это неправильное использование внедрения зависимостей. Это достойный случай для фабричного образца. Внедрение зависимостей используется для устранения зависимости от определенного типа с помощью интерфейсов и установки конкретного типа только во время выполнения (обычно с использованием сторонней среды, такой как ninject)

Например, у вас может быть IUserFactory, который тип BankAccount использует для получения IUsers. Во время выполнения класс BankAccount может быть «внедрен» с конкретным классом UserFactory вместо зависимости во время компиляции. Затем вы можете поменять UserFactories без необходимости в классе BankAccount.

...