Я сделаю все возможное, чтобы преодолеть путаницу в вопросе.
Прежде всего, «Объект данных» не является значимым термином. Если единственной определяющей характеристикой этого объекта является то, что у него нет методов, то он вообще не должен существовать . Полезный объект без поведения должен входить хотя бы в одну из следующих подкатегорий:
Объекты значений или «записи» вообще не имеют идентичности. Они должны быть типами значений с семантикой копирования по ссылке, предполагая, что среда поддерживает это. Поскольку это фиксированные структуры, VO должен быть только примитивного типа или фиксированной последовательности примитивов. Следовательно, у ВО не должно быть никаких зависимостей или ассоциаций; любой конструктор не по умолчанию будет существовать исключительно с целью инициализации значения, то есть потому, что оно не может быть выражено как литерал.
Объекты передачи данных часто ошибочно путают с объектами значений. DTOS делать есть тождества, или , по крайней мере , они могут . Единственная цель DTO - облегчить поток информации из одного домена в другой. У них никогда не бывает «зависимостей». Они могут иметь ассоциации (то есть с массивом или коллекцией), но большинство людей предпочитают делать их плоскими. По сути, они аналогичны строкам в выводе запроса к базе данных; это временные объекты, которые обычно необходимо сохранять или сериализовать, и поэтому они не могут ссылаться на какие-либо абстрактные типы, так как это сделает их непригодными для использования.
Наконец, объекты доступа к данным предоставляют оболочку или фасад для какой-либо базы данных. Очевидно, что у них есть зависимости - они зависят от соединения с базой данных и / или постоянных компонентов. Тем не менее, их зависимости почти всегда управляются извне и абсолютно невидимы для вызывающих. В паттерне Active Record это фреймворк, который управляет всем через конфигурацию; в более старых (древних по сегодняшним меркам) моделях DAO их можно было создать только через контейнер. Если бы я видел один из них с помощью инжектора конструктора, я бы очень, очень переживал.
Вы также можете думать о объекте сущности или «бизнес - объекте» , и в этом случае вы действительно хотите инъекцию поддержки зависимостей, но не в том смысле , что вы думаете , или по причинам вы думаете. Это не в пользу пользовательского кода , а в интересах менеджера сущностей или ORM, который будет молча вводить прокси-сервер, который он перехватывает, чтобы делать такие причудливые вещи, как понимание запросов или ленивая загрузка.
В них вы обычно не предоставляете конструктор для внедрения; вместо этого вам просто нужно сделать свойство виртуальным и использовать абстрактный тип (например, IList<T>
вместо List<T>
). Остальное происходит за кулисами, и никто не мудрее.
В общем, я бы сказал, что видимый шаблон DI, применяемый к «объекту данных», не нужен и, возможно, даже красный флаг; но в значительной степени это происходит потому, что само существование объекта является красным флагом, за исключением случая, когда он специально используется для представления данных из базы данных. Почти во всех других случаях это запах кода, как правило, начало модели анемичной области или, по крайней мере, полтергейста .
Чтобы повторить:
- Не создавайте «объекты данных».
- Если вам необходимо создать «объект данных», убедитесь, что он имеет четко определенную цель . Эта цель скажет вам, подходит ли DI. Невозможно принимать какие-либо конструктивные решения относительно объекта, который не должен существовать в первую очередь.
Плавник.