Использование фабрики в объекте модели предметной области? - PullRequest
4 голосов
/ 20 января 2010

Сценарий:

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

User newUser = userService.createNewUser("Hans Dampf");

или получить их из базы данных

User oldUser = userDao.findByName("Hans Dampf");

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

Каждый пользователь может иметь различные типы галерей, сохраненные в другой таблице.

class User {
 @OneToMany(fetch = FetchType.LAZY)
 @JoinColumn(name = "userId")
 private Set<Gallery> automatic = new HashSet<Gallery>();
}

Я хочу иметь простой способ включить определенную галерею. Поэтому мой API будет выглядеть так:

User user = ... // creating or retriving user
user.enableMainGallery();

Внутри этого метода было бы необходимо создать новый объект галереи и добавить его в список галерей. Но как создать этот новый экземпляр? Используя фабрику? Это потребует внедрения фабрики в объект домена (может быть проблематично).

public void enableAutomaticGallery() {
    automatic.add(automaticFactory.createAutomaticGallery(this));
}

Или определение моего интерфейса неверно? Должен ли я определить это как-то иначе, чтобы мне не пришлось вводить фабрику? Как?

Ответы [ 2 ]

1 голос
/ 20 января 2010

Модель вашего домена не должна знать ничего о каком-либо сервисе или слоях DAO или даже каких-либо фабричных объектах.

Я бы предложил вместо метода User.enableMainGallery(), который должен добавить Gallery объекты в коллекцию экземпляров (как вы сказали), вместо этого вы предоставляете метод User.addGallery(Gallery).

Таким образом, классы, отвечающие за «включение галереи», делают это, добавляя объекты в коллекцию list .

Другими словами, я не верю, что объект User должен отвечать за знание того, что означает «включить основную галерею». Это звучит как нечто, подпадающее под всеобщую логику бизнес-логики (я знаю, неоднозначный термин).

1 голос
/ 20 января 2010

Как вы говорите, доменные объекты не должны зависеть от объектов уровня приложения, таких как фабрики или Daos.

Домен обычно:

  • достаточно сложный с функциональными потребностями, без добавления других проблем (таких как постоянство, проверка, графический интерфейс и т. Д ...)
  • центральный и используется повсеместно (поэтому его сложность снижает производительность во многих действиях по кодированию)
  • для повторного использования во всех связанных приложениях и на всех уровнях даже может быть сериализован и отправлен в другую JVM на клиенте или веб-сервисе (если только он не зависит от объектов уровня приложения)

Таким образом, ваш метод enableAutomaticGallery должен быть на объекте Service. Он может иметь тот же код, но будет зависеть от приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...