0

我尝试练习 DDD,但我对我在下面写的这类规则有疑问:

领域层下的类 UserAggregator。

public class UserAggregator{
private UUID userId;
private String userName;
private String country;
//getter

boolean isUserNamePatternCorrect(){
  return this.userName.startsWith("TOTO"); 
}
}

领域层下的存储库接口。

public interface UserRepository {//User Table
     public UserAggregator findUser(UUID id);
     public void deleteUser(UserAggregator userToARchive);
}

public interface ArchiveUserRepository { //ArchiveUser Table
     public archiveUser(UUID id);
}

UserRepository/ArchiveUserRepository 使用 spring 数据在基础设施层下实现。

基础设施层下的服务。

public  class MyService {

@Autowired
UserRepository userRepo;

@Autowired
ArchiveUserRepository archiveUserRepo;

public void updateUserName(UUID userId){

       UserAggregator userAgg = userRepo.findUser(userId);
       if(Objects.nonNull(userAgg)){
         boolean isCorrect = userAgg.isUserNamePatternCorrect();
        if(!isCorrect){//-----------------------------1
            userRepo.deleteUser(userAgg);//-----------2
            archiveUserRepo.archiveUser(userAgg);//---3
           }
       }
//....
}
}

我的管理规则说,如果用户名与模式不匹配,则将用户归档到归档表中并将其从用户表中删除。

如您所见,规则(从 //1 到 //3)是写在服务类中而不是我的聚合器中!

这个对吗 ?或者如何管理这个?

4

2 回答 2

1

首先,它不是“Aggregator”,它是“Aggregate”,其次实际上没有放置“Aggregate”后缀,它没有带来任何价值并且违背了业务驱动的语言(Ubiquitous Language)。

我的管理规则说,如果用户名与模式不匹配,则将用户归档到归档表中并将其从用户表中删除

好吧,我认为问题在于这根本不是业务规则,而是技术规范。为什么业务专家会关心数据库表?DDD 有助于以与基础架构无关的方式对规则进行建模和描述,因此对技术规范建模没有多大帮助。

不过,有几种方法可以在保留技术规范的同时消除基础设施污染,例如存储库可以根据archived状态做出存储决策。

class User {
   boolean archived;

   void changeUserName(String userName) {
       this.userName = userName;

       if (!isUserNamePatternCorrect()) {
           this.archived = true;
       }
   }
}

class UserRepository {
    save(User user) {
        if (user.archived) ...
    }
}

如果您需要在技术上更加明确,那么您也许可以捕获域服务中的逻辑并使用与您所拥有的类似的方法,或者甚至调度域事件,例如UsernameChanged并由UserArchivingPolicy.

于 2021-05-20T00:36:58.403 回答
0

由于这似乎是关于在用户名不正确的特定情况下如何表现的基础设施规则,因此我认为您的代码没有任何问题。责任属于存储库恕我直言,所以我认为这种方法是不正确的。

于 2021-05-19T15:46:53.827 回答