4

Сценарий:Использование фабрики в объекте модели домена?

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

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(); 

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

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

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

+0

В сообщении здесь http://evan.bottch.com/2007/12/06/factory-and-repository-in-the-domain/ он рассказывает о том, как фабрики и DAO являются частью модели домена, и мы не должны воспринимать их как объекты уровня приложения. Я не уверен, где я стою, но это другая точка зрения. –

ответ

1

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

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

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

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

+0

Но это привело бы к модели анемичного домена, не так ли? Я должен был бы разоблачить коллекцию галерей, и логика была бы вне объекта. Или я что-то упускаю? – Arne

+0

@Arne Balance иногда трудно найти, я обычно думал, что объектно-ориентированный, как вы, и не хотел разделять проблемы в нескольких классах. Но Домен настолько сложный, настолько жизненно важный для понимания каждым разработчиком, и так много кода может быть добавлено всеми проблемами, что я нашел это непрактичным. Теперь мой домен является центром моего кода, украшенным аннотациями (для Persistence, Validation и т. Д.). Озабоченность представляет собой разные коды, либо в отдельных классах (DAO, Service, GUI-related), либо в технических кодах (проверка триггеров). – KLE

+2

Существование уровня сервиса не делает вашу модель домена анемией. Это когда вся логика вашего приложения попадает в сервисы, а ваша модель домена содержит только состояние, в котором вы попали «в анемию». Помните, что весь смысл программирования OO - объединить поведение (методы) и состояние (поля) в один артефакт - класс. Но вполне разумно иметь сервисный уровень, который помогает координировать действия между объектами в домене. –

1

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

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

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

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

+0

Это выглядит многообещающим в первую очередь и, похоже, является хорошим ответом. Но хорошо ли это? Я предполагаю добавить галерею типа «OldGallery» и иметь требование обновить ее до «NewGallery». В моем дизайне это приведет к методу «User.upgradeGallery (x)» (я согласен с тем, что класс пользователя, похоже, имеет много обязанностей). Но если пользователь управляет только коллекцией, логика снова выходит за рамки модели !? У меня была бы «GalleryService», которая удаляет старую галерею у пользователя и добавляет новую !? – Arne

+0

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

+0

Хорошо ... но тогда какая логика принадлежит модели? – Arne

Смежные вопросы