2009-09-17 5 views
10

В моем текущем проекте используется Spring, и наш архитектор решил разрешить Spring управлять службами, репозиториями и объектами Factory, но НЕ объектами домена. Мы внимательно следим за развитием домена. Причиной отсутствия использования пружины для доменных объектов является то, что весна позволяет использовать статическую зависимость. То, что я подразумеваю под действием статической зависимости, заключается в том, что зависимости указаны внутри xml-конфигурации, и они становятся «замороженными».Включение зависимостей во время выполнения с помощью Spring

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

Большая часть нашего проекта соответствует шаблону команды. поэтому, когда мы получаем команду, мы хотели бы построить нашу модель домена и на основе данных, полученных от команды, мы вводим определенный набор типов в наш совокупный корневой объект. Следовательно, из-за отсутствия способности Spring строить модель домена на основе данных времени выполнения мы вынуждены использовать статические заводские методы, сборщики и шаблоны Factory.

Может кто-нибудь, пожалуйста, сообщите, есть ли у весны проблемы с вышеуказанным сценарием?

Я мог бы использовать АОП для инъекций зависимостей, но тогда я не использую инфраструктуру весны.

ответ

2

Впрыск зависимостей Spring (и инъекции зависимостей в целом) в основном предназначен для проводки вместе сервисов, хранилищ и заводов и т. Д. Он не должен непосредственно обрабатывать вещи, которые необходимо выполнять динамически в ответ на команды и т. Д., Который включает большинство вещей с объектами домена. Вместо этого он обеспечивает контроль над тем, как это делается, позволяя вам подключаться к объектам, которые вы хотите использовать для их выполнения.

+2

Это продажа Весна немного коротка. Он способен на эти вещи, это требует немного больше усилий. – skaffman

10

Предлагаю вам ознакомиться с разделом в документах Spring относительно Using AspectJ to dependency inject domain objects with Spring.

Интересно, что вы сказали: «Я мог бы использовать AOP для инъекций зависимостей, но тогда я не использую инфраструктуру весны», учитывая, что АОП является основной частью of Инфраструктура Spring. Эти двое очень хорошо сочетаются.

Вышеупомянутая ссылка позволяет AOP прозрачно встраивать Spring в объекты домена, которые создаются без непосредственной ссылки на инфраструктуру Spring (например, с помощью оператора new). Это очень умно, но для этого требуется некоторая глубокая нагрузка.

+0

+1. Однако, в зависимости от сложности этого конкретного сценария, может оказаться возможным (и проще) использовать FactoryBeans вместо AOP. – ChssPly76

+0

Согласен, я обычно не стал бы беспокоиться. Однако, если приложение представляет собой жесткий диск DDD, то заводы могут оказаться нежелательными. – skaffman

5

Впрыск/конфигурация зависимостей Spring предназначена только для конфигурирования низкоуровневой технической инфраструктуры, такой как источники данных, управление транзакциями, удаленное управление, точки подключения сервлетов и т. Д.

Вы используете весну для маршрутизации между техническими API и вашими услугами, и внутри этих служб вы просто пишете нормальный Java-код. Удержание Spring от вашей модели домена и реализации услуг - это хорошо. Для начала вы не хотите привязывать бизнес-логику своего приложения к одной структуре или допускать «утечку» технических проблем низкого уровня в вашу модель домена приложения. Java-код гораздо легче модифицировать в среде IDE, чем в конфигурации XML Spring, поэтому, сохраняя бизнес-логику в Java, вы сможете быстрее и быстрее выполнять новые функции и поддерживать приложение более легко. Java гораздо более выразительна, чем формат Spring в формате XML, поэтому вы можете более четко моделировать концепции домена, если придерживаетесь простой Java.

+0

только потому, что Spring CAN сделать много вещей не означает, что правильный ответ заключается в том, чтобы ваше приложение использовало Spring для всех этих вещей. – M1EK

+0

Хотя это справедливо для стандартной модели анемичных доменов, ИМО хорошо справляется с этими задачами в управляемом доменом дизайне (который OP говорит, что он использует). –

+0

Этот ответ применяется очень (возможно, более) к неанемическим моделям домена, которые имеют чистый объектно-ориентированный дизайн и реализуют логику домена как методы на объектах модели домена. Анемические модели домена очень не стандартны. Их нужно избегать *. – Nat