spring如何实现领域驱动模型DDD呢

领域驱动模型, 让实体类有了一部分的业务方法, 那么在实体类中 @Autowired 一个 Dao 或者 MyBatis Mapper就不成功啊, 因为这个实体类不是 Component, 实体类都是 new 着用的

@Component
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
class Role{
    private Long id;
    private String name;
    
    //getter/setter
    
    //some method
    @Autowired
    private RoleMapper roleMapper;
    
    public boolean isBindMenu(){
        roleMapper.xxxxx();
    }
}

在其他地方如service中, 不能 new Role()啊, RoleMapper 注入不进来

阅读 10.2k
2 个回答

我不建议过早的把DDD的model的实现基于某一个framework来做,先实现model,而框架最好在某一个部分使用,简单的把entity认为是POJO + service的实现更是比较可笑和不理解真正ddd精髓的做法。DDD不是具体依赖某种语言进行实现的,那么加入换成ruby或者php怎么办?更何况spring并不是DDD的framework。所以,我的建议是试图理解如何设计model和实现的。更重要的是,把ddd的某一个buiding block单独拿出来使用那是完全错误的,完整的应用这些buiding block保证了你如何可以是一个相关领域业务逻辑的实现是高度偶尔,保证business state的准确性和非多样性。

领域模型驱动中有个概念是仓库, 可以用来获得模型
spring中有@Repository的注解代表这么个意思
就是你可以在interface RoleRepository中获得Role, 比如Repository#newRole()

你可以定义interface Role为接口, 在Role的实现中手动注入RoleMapper, 这个方法不暴露到接口中

@Repository
public class RoleRepositoryImpl implements RoleRepository {

    @Autowired
    RoleMapper roleMapper;

    @Override
    public Role newRole() {
      RoleImpl role = new RoleImpl();
      role.setRoleMapper(roleMapper);
      return role;
    }

}

public class RoleImpl implements Role {

    RoleMapper roleMapper;
    
    setRoleMapper(RoleMapper roleMapper) {
        this.roleMapper = roleMapper;
    }
    
    // other setter or getters
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏