DAO仅保留用于基本CRUD操作,还是也可能包含一些复杂的搜索逻辑?
想象一下两个实体类Book和Author以及它们之间的多对多关系。此时,单个DAO可能绰绰有余,因为两个实体的基本CRUD操作都是相同的。
然而,随着应用程序变得越来越复杂,出现了新要求,例如: 1.找到给定作者的第一本书 2.找到作者在一段时间内写过的书 3.查找给定作者撰写的特定主题的书籍 4. ....等等
所有这些应该去哪里?我是否为每个实体创建了一个单独的DAO类,并将它们放在那里?它们属于DAO层吗?
我有这个困境: 应该采用以下方法: findBooks(作者) findBooks(出版商出版商) 在BookDAO中,还是在AuthorDAO中,另一个是PublisherDAO?
或许我应该考虑一个全新的抽象,它在DAO之上,并将它们留给基本的CRUD操作 - 例如SearchService,它列出了所有可能的搜索?
答案 0 :(得分:2)
答案 1 :(得分:1)
所有这些应该去哪里?我是否为每个实体创建了一个单独的DAO类,并将它们放在那里?它们属于DAO层吗?
绝对是DAO(层)的工作和召唤。你所拥有的是无关紧要的。具体方法应该转到它所属的DAO。
或许我应该考虑一个全新的抽象,它在DAO之上,并将它们留给基本的CRUD操作 - 例如SearchService,它列出了所有可能的搜索?
这里有两件事。
答案 2 :(得分:1)
所有这些应该去哪里?我是否为每个实体创建了一个单独的DAO类,并将它们放在那里?它们是否属于DAO层?
见下文。
我有这样的困境:以下方法应该放在哪里:findBooks(作者作者)findBooks(出版商出版商)既可以在BookDAO中,也可以在AuthorDAO中,另一个是PublisherDAO
这取决于我认为这不是企业软件架构的问题,而是OOD。随着您的逻辑变得越来越复杂,您必须牢记增加内聚力并减少软件组件之间的耦合,并分别从这些被认为属于的方法中提取新类(重构目录http://martinfowler.com/refactoring/catalog/extractClass.html中的Extact类)相同的业务环境,如AuthorDAO,关于作者功能的所有方法和所有图书调用的书籍,以便使您的代码更具可读性,可重用性,可测试性,可维护性......
或许我应该考虑一个全新的抽象,它在DAO之上,并将它们留给基本的CRUD操作 - 例如SearchService,它列出了所有可能的搜索?
多层模型中存在抽象,如果您的意思是业务逻辑,则称为业务层。 您可以将业务逻辑与业务对象相关联。但findXXX方法属于DAO,它位于持久性和业务层之间。