Как справиться с внедрением зависимостей в богатые доменные модели? - PullRequest
7 голосов
/ 20 января 2010

В проекте веб-сервера с моделью расширенного домена (логика приложения в модели, а не в службах), как вы справляетесь с внедрением зависимостей в объекты модели? Каковы ваши переживания?

Используете ли вы какую-либо форму АОП? Как Springs @ Конфигурируемая аннотация? Время загрузки или время сборки плетения? Проблемы, с которыми вы столкнулись?

Вы используете ручной впрыск? Тогда как вы справляетесь с различными сценариями реализации (создание объектов с помощью библиотеки [например, Hibernate], создание объектов с «новым» ...)?

Или вы используете какой-то другой способ внедрения зависимостей?

Ответы [ 3 ]

4 голосов
/ 19 мая 2010

Мы используем @Configurable от Spring (вместе с обычным оператором new), который работает как шарм. Не более моделей анемичных доменов . Наконец, это гораздо более объектно-ориентированный дизайн, не так ли:

Person person = new Person(firstname, lastname);
// weird
peopleService.save(person);
// good (save is @Transactional)
person.save();

Mail mail = new Mail(to, subject, body);
// weird
mailService.send(mail);
// good (send is @Transactional)
mail.send();

Мы не сравнивали производительность. До сих пор мы просто не чувствовали в этом необходимости.

РЕДАКТИРОВАТЬ: вот как будет выглядеть класс:

@Configurable("person")
public class Person {
    private IPersonDAO _personDAO;
    private String _firstname;
    private String _lastname;

    // SNIP: some constructors, getters and setters

    @Transactional(rollbackFor = DataAccessException.class)
    public void save() {
        _personDAO.save(this);
    }

    @Transactional(readOnly = true)
    public List<Role> searchRoles(Company company) void{
        return _personDAO.searchRoles(this, company);
    }

    // it's getting more interesting for more complex methods
    @Transactional(rollbackFor = DataAccessException.class)
    public void resignAllRoles(Company company) {
        for (Role role : searchRoles(company)) {
            role.resign();
        }
    }
}

// the implementation now looks like this
personService.getPerson(id).resignAllRoles(company);

// instead of this
roleService.resignAll(personService.searchRoles(personService.getPerson(id), company));

И это конфигурация Spring:

<context:spring-configured />
<bean id="person" class="org.example.model.Person" lazy-init="true">
  <property name="personDAO" ref="personDAO" />
</bean>

Примечание: как вы видите, до сих пор существуют службы, например, для поиска объектов (personService.getPerson (id)), но все методы, которые работают с переданным объектом (например, person), перемещаются в этот класс сам (т.е. person.save () вместо personService.save (person)). Сам метод остается тем же и работает с любым нижележащим уровнем доступа к данным (чистый JDBC, Hibernate, JPA, ...). Он просто переместился туда, где и должен.

2 голосов
/ 25 января 2010

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

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

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

0 голосов
/ 13 марта 2014

Вы также можете проверить ссылку ниже, которая может очень помочь.

Прагматический взгляд на архитектуру программного обеспечения и модель обогащенного домена описывает, где встречаются модель обогащенного домена и архитектура программного обеспечения.

Кроме того, в нем описывается, как настроить, реализовать и настроить это представление с помощью следующих методов, сред и API-интерфейсов:

  1. Spring; сделать жизнь проще для разработчика
  2. JPA; для реляционного отображения объектов
  3. AspectJ; в полной мере ощутить богатую модель домена
  4. JUnit; для интеграционного тестирования вашей Rich Domain Model

http://www.ruimtefotografie.org/forum/viewtopic.php?f=32&t=193

...