在Spring中将多个存储库自动装配到单个DAO中 - 不好的做法?

时间:2018-01-30 20:32:43

标签: java spring mongodb spring-mvc

假设我有以下Spring Mongo存储库。 ObjectOne,ObjectTwo和ObjectThree表示存储在同一数据库中的单独集合中的文档

public interface RepositoryOne extends MongoRepository<ObjectOne, String> {
}

public interface RepositoryTwo extends MongoRepository<ObjectTwo, String> {
}

public interface RepositoryThree extends MongoRepository<ObjectThree, String> {
}

然后是单个DAO类

public class ExampleDAO {
    @Autowired
    private RepositoryOne repositoryOne;

    @Autowired
    private RepositoryTwo repositoryTwo;

    @Autowired
    private RepositoryThree repositoryThree;

    //Various methods performing operations with repositoryOne
    //Various methods performing operations with repositoryTwo
    //Various methods performing operations with repositoryThree
}

将多个存储库自动装配到上面的单个DAO中被认为是不好的做法吗?感觉这个课程可能做得太多,理想情况下我应该有一个单一的存储库来维护单一的责任。如果这是不好的做法,那么每个存储库的单独DAO是否可行,或者是否有一种Spring魔术方法来创建可用于调用更具体的存储库的单个存储库?

2 个答案:

答案 0 :(得分:3)

对于单个班级,有多个无关职责是一种不好的做法。如果它们相关,请考虑创建“服务”类并自动装配存储库。而且服务类中的方法也可以抽象存储库中的方法,例如:

class ExampleService {
    @Autowired
    private RepositoryOne repositoryOne;

    @Autowired
    private RepositoryTwo repositoryTwo;

    void saveEmployee(Employee e) {
        repositoryOne.save(e);
        repositoryTwo.update(e.getEmpId);
    }
}

答案 1 :(得分:1)

除非查看实际的业务逻辑,否则没有人能够判断您的ExampleDAO是否可以使用多个存储库。

但是,您的ExampleDAO类似乎充当了业务服务(对于DAO vs Repository的主题看起来here,它们实际上都是实现数据访问层的不同方式)。换句话说,您需要确保您的ExampleDAO类处理/拥有一项责任。

另外,另一个重要的一点是,使用场注入而不是使用构造函数注入是一种不好的做法。我建议你就这个问题通过here