2012-05-17 3 views
1

В обзоре кода появились следующие комментарии: «Я думаю, вы на самом деле хотите ввести завод в качестве экземпляра, чтобы вы могли восстановить завод, если это необходимо». и «важный намек: фабрики не должны быть статическими, но должны быть введены».Инъекционные заводы - как и почему?

Test.java:

Foo foo = FooFactory.get(argument); 

FooFactory.java:

public final class FooFactory { 
    public static Foo get(String argument) { 
     return new Foo(); 
    } 
} 

Как я должен был сделать это иначе? Что означает «переподготовка» в первом комментарии рецензента?

+1

Возможно, вам стоит попросить рецензента, что она имела в виду. –

+0

Вы попросили обозреватель кода объяснить его вам более подробно? Лично я понятия не имею, о чем он говорит. – DGH

+0

Что бы «переделать» вас? Если ваш завод не основан на интерфейсе, я не вижу причин для инъекций. – duffymo

ответ

6

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

Вместо этого, вы должны использовать инъекции зависимостей (Spring пример здесь):

public class SomeService 
    private FooFactory fooFactory; 

    @Autowired 
    public SomeService(FooFactory fooFactory) { 
     this.fooFactory = fooFactory; 
    } 

    public void someMethod(String arg) { 
     Foo foo = fooFactory.create(arg); 
     ... 
    } 
    .... 
} 

И теперь, в модульном тесте, вы можете вводить любые FooFactory реализации вы хотите (как правило, макет).

+0

Были тесты Unit, поэтому я предполагаю, что это то, что имел в виду рецензент. Большое спасибо за этот ответ! –

+0

Я новичок в DI. Это, конечно, здорово, что здесь есть фабрика, но фабрика будет создавать экземпляр Foo с использованием нового ключевого слова, что приводит к тому, что объект foo не управляется контейнером DI. Все в порядке? Думаю, мой вопрос в том, что когда класс должен управляться контейнером, и когда было бы хорошо использовать новое ключевое слово? Благодаря! – KFL

3

С большинством фреймворков внедрения зависимостей вы можете привязать реализацию конкретного объекта во время выполнения. Я бы сказал, что это то, о чем говорит рецензент. Чтобы воспользоваться этим, вы, конечно, должны были бы ввести свой завод, а не статически создавать его.

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