大架构的模型穿越

不同的上下文(context)模型协作,举个例子,就类似一个用户账号(userID),在不同的游戏场景play,进入中世纪,同样的user,扮演的是一个骑士(类型class),进入未来世界,同样的user,扮演的是机器人,那么在边界之间该如何穿越呢,这里就在进入不同的时空隧道时,给一个函数入口F(String userID),通过这个函数,就进入到了不同的世界,这就需要设计师在设计接口的时候统一留一个标识作为USER的记录,单体结构下可以就是一个字符串,微服务就是一个RESTFUL接口,最终都是将这个userID变为自己边界内的一个领域模型(在中世纪领域,是骑士,在未来世界,是机器人)来完成不同领域的业务逻辑(PLAY)

//一个应用服务,把传递过来的anAuthorId转变为Forum领域的Author
public class ForumApplicationService { 
	public void startExclusiveForumWithDiscussion(
            String aTenantId,
            String anExclusiveOwner,
            String aCreatorId,
            String aModeratorId,
            String anAuthorId,
            String aForumSubject,
            String aForumDescription,
            String aDiscussionSubject,
            ForumCommandResult aResult) {
    	Tenant tenant = new Tenant(aTenantId);

        String forumId =
                this.forumQueryService()
                    .forumIdOfExclusiveOwner(
                            aTenantId,
                            anExclusiveOwner);

        Forum forum = null;

        if (forumId != null) {
            forum = this.forumRepository()
                        .forumOfId(
                                tenant,
                                new ForumId(forumId));
        }
      
      if (forum == null) {
            forum = this.startNewForum(
                    tenant,
                    aCreatorId,
                    aModeratorId,
                    aForumSubject,
                    aForumDescription,
                    anExclusiveOwner);
        }

        String discussionId =
                this.discussionQueryService()
                    .discussionIdOfExclusiveOwner(
                            aTenantId,
                            anExclusiveOwner);

        Discussion discussion = null;

        if (discussionId != null) {
            discussion = this.discussionRepository()
                             .discussionOfId(
                                     tenant,
                                     new DiscussionId(discussionId));
        }

        if (discussion == null) {
            Author author =
                    this.collaboratorService().authorFrom(tenant, anAuthorId);
            discussion =
                    forum.startDiscussionFor(
                            this.forumIdentityService(),
                            author,
                            aDiscussionSubject,
                            anExclusiveOwner);

            this.discussionRepository().save(discussion);
        }

        if (aResult != null) {
            aResult.resultingForumId(forum.forumId().id());
            aResult.resultingDiscussionId(discussion.discussionId().id());
        }
    }
}
punkmonday /
Published under (CC) BY-NC-SA in categories ddd  tagged with ddd