2012-02-14 5 views
3

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

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

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?

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

Спасибо!

+0

Связанные: http://stackoverflow.com/questions/4835046/why-not-use-an-ioc-container-to-resolve-dependencies-for-entities-business-objec/4836790#4836790 –

ответ

1

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

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

Смежные вопросы