有“注意”域对象作为实体。
@Entity
@Getter
@Setter
class Note {
@ManyToOne(..)
private User writer;
private String title;
private String content;
... some attributes ...
private Date createdAt;
private Date updatedAt;
private User latestModifier;
... some methods ...
}
我认为“NoteEditor”用于处理打开和保存笔记,如下所示。
class NoteEditorImpl implements NoteEditor {
private NoteRepository repository;
private ApplicationPublisher publisher;
private Note note; // opened note.
private User user; // operator.
NoteEditorImpl(ApplicationContext context, User user) {
this.repository = context.getBean(NoteRepository.class);
this.publisher = context.getBean(ApplicationPublisher.class);
this.user = user;
}
NoteEditor open(Note note) {
if ( !note.canBeEditedBy(user) ) {
throw new ServiceRuntimeException('... cause message ...');
}
this.note = note;
return this;
}
NoteEditor setTitle(String title) {
...
this.note.setTitle(title);
return this;
}
...
Note save() {
this.note.setLatestModifier(this.user);
this.note.setUpdatedAt(new Date());
publisher.publish(new NoteEditedEvent(this.note));
repository.save(this.note);
}
}
如您所见,NoteEditor 不是无状态的。
我想知道 NoteEditor 是 DDD 中的域服务吗?
我也想看看你的意见,纠正我的设计成长。
附加。我解释了为什么做有状态的编辑器。
我可以假设有两个客户端(WebClient 和 MobileClient)。
WebClient 将使用它,如下所示。
NoteEditor editor = noteService.getEditor(sessionUserId);
editor.open(selectedNote).setTitle(…).setContent(…).save();
MobileClient 将使用它,如下所示。
NoteEditor editor = noteService.getEditor(sessionUserId);
editor.open(selectedNote).setTitle(..).save();
这意味着某些客户端可以一次编辑一些属性。
因此,我想在 open() 方法中检查 editable(authority),我想将修改信息放在 save() 方法中,例如上面的代码块。
下面是 NoteService 代码。
class NoteServiceImpl implements NoteService {
...
NoteEditor getEditor(long userId) {
User user = userRepository.findOne(userId);
NoteEditor editor = new NoteEditor(context, user);
return editor;
}
List<Note> getMyNotes(...) ...
}