2011-04-28 125 views
4

我将为我的应用程序设计一个DAO层。我的重点是,服务只是调用独立于实施的DAO。Generic Dao和服务层

public interface GenericSearchDao{ 
     List getAll(); 
     List getByQuery(String query); 
} 

public class UserJdbcSearch implements GenericSearchDao{ 

     public List getAll(){ 
       // Get all users; 
     } 

     List getByQuery(String query){ 
       // Get users by query; 
     } 

} 

public class UserFileSystemSearch implements GenericSearchDao{ 

     public List getAll(){ 
       // Get all users from file system; 
     } 


     List getByQuery(String query){ 
       // Get users by query[this leads to invalid operation]; 
     } 
} 

public userService { 

     private GenericSearchDao dao = new UserFileSystemSearch(); 

     public List getUsers(){ 
       rturn dao.getAll(); 
     } 

     public List getByQuery(String query){ 
       return dao.getByQuery(query); 
     } 
} 

帮助要求:

我应该做的就是从'getByQuery(查询)的具体implementaions去掉,因为数据存储可以是RDBMS,文件系统,FTP等

我应该如何一般设计我的Dao层?

如果任何一个人说,“从GenericSearchDao删除getByQuery()”,那么我应该在的情况下做的,我需要具体到经营数据如:与角色,与产品等用户用户..

+0

Copypaste bug! 'Stirng'。 – BalusC 2011-04-28 21:40:41

+0

谢谢,纠正 – Zeeshan 2011-04-28 21:45:58

回答

0

嘿,检查这个网站DAO Implementation。有一些DAO实现具有不同的设计模式。我认为带有Abstact工厂的DAO将适合您。

+0

是的,但在这种情况下的问题是目前我有一个道及其impl,但在未来,我可以有30道和其30个IMPL的......我需要最小化或杀死这个重复也需要解耦服务与DAO及其底层实现。 – Zeeshan 2011-04-28 21:45:07

+0

看看http://codeblock.engio.net/?p=180。我提出的解决方案使用不同存储技术的技术不可知实现作为特定于域的DAO的基础机制。 – bennidi 2014-02-06 09:12:19

0

我应该做的就是从'getByQuery(查询)的具体implementaions去掉,因为数据存储可以是RDBMS,文件系统,FTP等

你不这样做,你只需要提供“通用”查询,例如“name = a”可以在数据库中执行查询,或查找名为“a”的文件或其他任何东西。

+0

先生,难道你不认为这会导致一个小的查询语言,我将为每个基础implementationaion开发:) – Zeeshan 2011-04-28 21:48:32

0

你打算在“查询”参数中传递什么信息? SQL?我将String参数替换为特定于业务的特定参数,也许是一个带有“name”,“surname”等字段的小类。底层实现会将其转换为SQL或远程服务调用或其他实现特定的魔法。

+0

我appriciate你的答案。你的答案会导致一个小的查询语言,所以我可以根据底层实现来解释它。但我不想发明这种查询语言。我认为有一个选择,道模式,我应该认识到。感谢您的回复 – Zeeshan 2011-04-29 22:09:21