1

有“注意”域对象作为实体。

@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(...) ...

}
4

1 回答 1

3

您的 NoteEditor 有两个职责。一种是编辑Note 对象,另一种是打开和保存Note 对象。如果将两者分开,一切都会很快到位。您需要一个用于打开和保存的 NoteRepository 以及一个用于流畅 API 的 NoteBuilder。NoteBuilder 不是域对象,而只是一个帮助类,用于通过 fluent API 构建笔记。

于 2013-09-30T17:54:51.563 回答