DDD:从聚合根访问存储库被视为不良做法?

Tei*_*raz 0 java domain-driven-design ddd-repositories aggregateroot

我已经读过从聚合根访问存储库被认为是不好的做法.如果是,请考虑以下示例:

class User {
   private String username;
   public void changeUsername(String newUsrname) {
     // How will I persist username to database if I don't have access to repository from aggregate root?
     ...
   }
}
Run Code Online (Sandbox Code Playgroud)

如果我无法从聚合根访问存储库,我将如何将用户名持久保存到数据库?

我这样看:

class User {
    private String username;
    private UserRepository userRepository;
    public User(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public void changeUserName(String newUsername) {
       this.username = newUserName;
       userRepository.save(this); 
    }
}
Run Code Online (Sandbox Code Playgroud)

或者我错过了DDD概念中的一些东西?

Voi*_*son 7

如果我无法从聚合根访问存储库,我将如何将用户名持久保存到数据库?

当前的实践通常处理应用程序组件中的I/O,而不是域模型中的I/O.

Application {
    void when(ChangeUserName command) {
        User user = this.userRepository.getUserById(command.userId);
        user.changeName(command.name);
        this.userRepository.save(user);
    }
}
Run Code Online (Sandbox Code Playgroud)

推荐阅读:Vladimir Khorikov关于域模型隔离.