Контейнер DI, фабрика, или новый для эфемерных объектов?

Имея дело с объектами, которые требуют данных, известных только во времени выполнения, таком как имя пользователя и пароль, где должен возразить, экземпляр происходит: при помощи нового, на фабрике, или на контейнере DI?

Например, я мог просто new объект, как только у меня есть данные:

UserCredentials creds =
    new UserCredentials(dialog.getUsername(), dialog.getPassword());

Или, я мог использовать фабрику:

UserCredentials creds =
    CredentialsFactory.create(dialog.getUsername(), dialog.getPassword());

Или, я мог использовать поставщика в контейнере DI (который в этом случае по существу будет управляемой параметром фабрикой). [Пример кода опущен.]

Это кажется оба неправильно, чтобы использовать контейнер DI для чего-то настолько простого все же, также кажется неправильным не использовать его для его самого полного.

9
задан Kaleb Pederson 13 January 2010 в 22:27
поделиться

4 ответа

Как всегда, это зависит, но в качестве общего правила статический завод, похожий на ваш второй вариант, является лишь редко хорошей идеей.

New up up up ust ustercredentiale объекта кажется справедливым выбором, потому что класс UserCredentials выглядит как автономный бетонный класс, который может быть полностью создан всеми его инвариантами из имени пользователя и пароля.

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

Использование абстрактной фабрики часто очень ценна, потому что он позволяет составить экземпляр из комбинации значений времени выполнения и других зависимостей. См. здесь для получения дополнительной информации.

Использование абстрактной фабрики также помогает с тестированием устройства , поскольку вы можете просто проверить, что возвращаемое значение или конечное состояние или все, что вы заботитесь о, связаны с выходом абстрактных заводов - для которых вы можете легко Поставьте тест Double , потому что это ... Аннотация.

8
ответ дан 4 December 2019 в 20:24
поделиться

Блог тестирования Google имеет пост, который пытается ответить на этот вопрос . Основная идея состоит в том, что вы можете классифицировать каждый из ваших классов как «надобываемый» или «инъекционный инъекционный», и что это нормально, чтобы просто «новую» новых «новых».

Я различаю 2 основных категория «новой»:

  • , такие как int , строка , dateTime , Etcetera.
  • Сущности, такие как Клиент , , , , Сотрудник , Etcetera. Я думаю, что ваш UserClentials класс падает под этим заголовком.

Важно понять, что ночи могут иметь (показывать) поведение . Если вы совершите ошибку, думаете, что на ноты не должны иметь какие-либо тесты на поведение или единиц, вы получите модуль анемии Anti-Pattern.

Побочный эффект имеющих «новых» с поведением состоит в том, что это поведение не может быть отделено в модульных испытаниях ваших инъекций. Хорошо; Нормально иметь сильную связь между вашим моделью домена и остальной частью вашего приложения.

Кроме того, на ноты могут знать об инъекционных инъекциях, но они только сотрудничают с ними временно. Например, UserClentials не должен принимать IuserDatabase в качестве аргумента конструктора. Вместо этого может быть метод UserEdentials.Verify (IuserDatabase) .

Редактировать: Я в настоящее время больше не уверен, что я писал выше. Сущности также могут быть построены через (инъекционные) заводы вместо того, чтобы вызов их конструктору напрямую. Заводская реализация может затем вводить вещи в объекте.

3
ответ дан 4 December 2019 в 20:24
поделиться

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

Это действительно зависит от того, когда и где вам понадобится этот объект, и будут ли в результате этого появляться ненужные зависимости.

0
ответ дан 4 December 2019 в 20:24
поделиться

Что вы собираетесь сделать с помощью GUID? Столбец int identity также будет уникальным в этой таблице. Действительно ли вам нужна или требуется возможность репликации? Если это так, то использование GUID на самом деле предпочтительнее в вашей архитектуре, чем обработка столбцов идентификаторов с помощью одного из параметров управления диапазоном идентификаторов ?

Если вам нравятся «симпатичные» идентификаторы, созданные с помощью образца Active Record, то я думаю, что я бы попытался использовать их вместо GUID. Если требуется репликация, используйте одну из стратегий репликации, соответствующих столбцам идентификаторов.

-121--4435387-

Как насчет

<% foo ||= default_value %>

Это говорит "используйте foo , если это не равно нулю или true. В противном случае присвойте default _ value foo "

-121--598383-

Если для приложения уже установлен контейнер DI, используйте этот подход. В противном случае используйте заводской метод.

0
ответ дан 4 December 2019 в 20:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: