Инъекция зависимостей: объединить преимущества Инъекции конструктора с преимуществами Инъекции сеттера? - PullRequest
2 голосов
/ 18 апреля 2011

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

Так что я бы хотел пройти мимо сеттеров, но мой объект, содержащий зависимости, не должен создаваться, если эти сеттеры не были заполнены.

Как это сделать, если не зависимость01 не пуста, а зависимость2 не пуста, зная, что ОБА не должна быть пустой?

Ответы [ 3 ]

1 голос
/ 18 апреля 2011

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

Если бы вы использовали статический метод фабрики, вы могли бы использовать сеттеры - но это потребовало бы, чтобы ваш конструктор был закрытым, поэтому на самом деле ничего не изменится кроме конструктора.

Вы можете использовать метод Initialize, который основан на определенных свойствах, но вам придется полагаться на этот метод, который вызывается. Это означает, что нужно либо много работать, чтобы удостовериться, что метод был вызван (например, каждый метод класса должен вызывать if (!IsInitialized) throw ...), либо вы просто вводите хрупкость в свой код.

Любое альтернативное решение является менее надежным или более сложным, чем просто размещение абсолютно необходимых данных в вашем конструкторе - для этого и нужен параметр конструктора. Я бы посоветовал вам пересмотреть произвольное требование, чтобы параметры конструктора были «зарезервированы» в пользу чего-то более технического.

1 голос
/ 18 апреля 2011

Вы можете создать фабричный класс, который принимает зависимости.

factory = new Factory(dep01, dep02);

И использовать метод create для передачи вашей бизнес-сущности.

factory.Create(someBusinessObject);

Я не совсемЯ люблю это (неправильное) использование конструктора фабрики, но это решает вашу проблему.

1 голос
/ 18 апреля 2011

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

РЕДАКТИРОВАТЬ : С моей точки зрения, лучшим является шаблон строителя, который сочетает в себе лучшее из обоих:

  • Разрешить создание неизменных объектов (!) - сеттеры нарушают это
  • Позволяет устанавливать зависимости по имени вместо необходимости использовать индексы - самое большое (если не только) преимущество сеттеров
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...