it-swarm-pt.tech

Qual é a diferença entre os padrões DAO e Repositório?

Qual é a diferença entre os DAO (Data Access Objects) e os padrões de Repositório? Estou desenvolvendo um aplicativo usando Enterprise Java Beans (EJB3), Hibernate ORM como infra-estrutura, e Domain-Driven Design (DDD) e Test-Driven Development (TDD) como técnicas de design.

370
Thurein

DAO é uma abstração de persistência de dados.
Repository é uma abstração de ma coleção de objetos.

DAO seria considerado mais próximo do banco de dados, geralmente centrado em tabelas.
Repository seria considerado mais próximo do Domínio, lidando apenas com Raízes Agregadas.

Repository poderia ser implementado usando DAO, mas você não faria o oposto.

Além disso, um Repository é geralmente uma interface mais estreita. Deve ser simplesmente uma coleção de objetos, com um Get(id), Find(ISpecification), Add(Entity).

Um método como Update é apropriado em um DAO, mas não um Repository - ao usar um Repository, as alterações em entidades geralmente seriam controladas por UnitOfWork separado.

Parece comum ver implementações chamadas de Repository que são realmente mais de um DAO e, portanto, acho que há alguma confusão sobre a diferença entre elas.

388
quentin-starin

OK, acho que posso explicar melhor o que eu coloquei nos comentários :). Então, basicamente, você pode ver ambos como o mesmo, embora o DAO seja um padrão mais flexível que o Repositório. Se você quiser usar ambos, você usaria o Repositório em seus DAO-s. Eu explicarei cada um deles abaixo:

REPOSITÓRIO:

É um repositório de um tipo específico de objetos - ele permite que você procure por um tipo específico de objetos, além de armazená-los. Normalmente, ele só irá lidar com um tipo de objetos. Por exemplo. AppleRepository permitiria que você fizesse AppleRepository.findAll(criteria) ou AppleRepository.save(juicyApple). Observe que o Repositório está usando termos do Modelo de Domínio (não termos do BD - nada relacionado a como os dados são persistidos em qualquer lugar).

Um repositório provavelmente armazenará todos os dados na mesma tabela, enquanto o padrão não requer isso. O fato de tratar apenas um tipo de dado, torna-o logicamente conectado a uma tabela principal (se usada para persistência de banco de dados).

DAO - objeto de acesso a dados (em outras palavras - objeto usado para acessar dados)

Um DAO é uma classe que localiza dados para você (é principalmente um Finder, mas é comumente usado para também armazenar os dados). O padrão não restringe você a armazenar dados do mesmo tipo, assim você pode facilmente ter um DAO que localize/armazene objetos relacionados.

Por exemplo. você pode facilmente ter UserDao que expõe métodos como

Collection<Permission> findPermissionsForUser(String userId)
User findUser(String userId)
Collection<User> findUsersForPermission(Permission permission)

Todos esses estão relacionados ao usuário (e segurança) e podem ser especificados sob o mesmo DAO. Este não é o caso do Repositório.

Finalmente

Note que ambos os padrões realmente significam o mesmo (eles armazenam dados e eles abstraem o acesso a ele e ambos são expressos mais perto do modelo de domínio e dificilmente contêm qualquer referência DB), mas a maneira como eles são usados ​​pode ser ligeiramente diferente, sendo DAO um pouco mais flexível/genérico, enquanto o Repository é um pouco mais específico e restritivo para um tipo apenas.

100
Stef

Os padrões DAO e Repository são formas de implementar a camada de acesso a dados (DAL). Então, vamos começar com o DAL primeiro.

Aplicativos orientados a objeto que acessam um banco de dados devem ter alguma lógica para manipular o acesso ao banco de dados. Para manter o código limpo e modular, recomenda-se que a lógica de acesso ao banco de dados seja isolada em um módulo separado. Na arquitetura em camadas, este módulo é o DAL.

Até agora, não falamos sobre nenhuma implementação em particular: apenas um princípio geral que coloca a lógica de acesso ao banco de dados em um módulo separado.

Agora, como podemos implementar esse princípio? Bem, um modo conhecido de implementar isto, em particular com frameworks como o Hibernate, é o padrão DAO.

O padrão DAO é uma maneira de gerar o DAL, em que, normalmente, cada entidade de domínio tem seu próprio DAO. Por exemplo, User e UserDao, Appointment e AppointmentDao, etc. Um exemplo de DAO com Hibernate: http://gochev.blogspot.ca/2009/08/hibernate-generic-dao.html .

Então o que é padrão Repositório? Como o DAO, o padrão Repositório também é uma maneira de alcançar o DAL. O ponto principal no padrão Repositório é que, da perspectiva do cliente/usuário, ele deve se parecer ou se comportar como uma coleção. O que se entende por se comportar como uma coleção não é que ela deva ser instanciada como Collection collection = new SomeCollection(). Em vez disso, significa que ele deve suportar operações como adicionar, remover, conter, etc. Essa é a essência do padrão Repositório.

Na prática, por exemplo, no caso de usar o Hibernate, o padrão Repositório é realizado com o DAO. Isso é uma instância de DAL pode ser tanto a mesma instância do padrão DAO e padrão de repositório.

Padrão de repositório não é necessariamente algo que se constrói em cima do DAO (como alguns podem sugerir). Se os DAOs forem projetados com uma interface que suporte as operações mencionadas acima, ela será uma instância do padrão Repositório. Pense nisso: se os DAOs já fornecem um conjunto de operações de coleta, então, qual é a necessidade de uma camada extra sobre ela?

73
Nazar Merza

Francamente, isso parece uma distinção semântica, não uma distinção técnica. A frase Data Access Object não se refere a um "banco de dados". E, embora você pudesse projetá-lo para ser centrado no banco de dados, acho que a maioria das pessoas consideraria fazer uma falha de design.

O objetivo do DAO é ocultar os detalhes de implementação do mecanismo de acesso a dados. Como o padrão do repositório é diferente? Tanto quanto eu posso dizer, não é. Dizer que um Repositório é diferente para um DAO porque você está lidando com/retornar uma coleção de objetos não pode estar certo; Os DAOs também podem retornar coleções de objetos.

Tudo o que li sobre o padrão do repositório parece depender desta distinção: design DAO ruim versus design DAO bom (também conhecido como padrão de design do repositório).

61
rakehell404

Repositório é um termo orientado ao domínio mais abstrato que faz parte do Design Dirigido por Domínio, faz parte do design do seu domínio e uma linguagem comum, DAO é uma abstração técnica para a tecnologia de acesso a dados, repositório só se preocupa em gerenciar dados e fábricas existentes para criação de dados.

verifique estes links:

http://warren.mayocchi.com/2006/07/27/repository-or-dao/http://fabiomaulo.blogspot.com/2009/09/repository-ou -dao-repository.html

16
Mohamed Abed

A principal diferença é que um repositório manipula o acesso às raízes agregadas em um agregado, enquanto o DAO manipula o acesso a entidades. Portanto, é comum que um repositório delega a persistência real das raízes agregadas em um DAO. Além disso, como a raiz agregada deve manipular o acesso das outras entidades, talvez seja necessário delegar esse acesso a outros DAOs.

6
pablochacin

Repositório não são nada além de DAO bem desenhado.

ORM são centrados em tabela, mas não em DAO.

Não há necessidade de usar vários DAO no repositório, pois o próprio DAO pode fazer exatamente o mesmo com repositórios ORM/entidades ou qualquer provedor DAL, não importa onde e como um carro é mantido 1 tabela, 2 tabelas, n tabelas, meia mesa, um serviço da Web, uma tabela e um serviço da Web, etc. Os serviços usam vários DAO/repositórios.

Meu próprio DAO, digamos que CarDao só lida com o DTO de carro, quero dizer, só leve DTO de carro em entrada e só devolva DTO de carro ou coleções de DTO de carro em saída.

Então, assim como o Repositório, o DAO é realmente um IoC, para a lógica de negócios, permitindo que as interfaces de persistência não sejam intimidadas por estratégias ou legados de perseverança. O DAO encapsula a estratégia de persistência e fornece a interface de persistência relacionada ao domaine. Repositório é apenas uma outra Palavra para aqueles que não entenderam o que era um DAO bem definido.

3
Cyril

Tente descobrir se o DAO ou o padrão Repositório é mais aplicável à seguinte situação: Imagine que você gostaria de fornecer uma API de acesso a dados uniforme para um mecanismo persistente para vários tipos de fontes de dados, como repositórios RDBMS, LDAP, OODB, XML e arquivos simples.

Consulte também os links a seguir, se estiver interessado:

http://www.codeinsanity.com/2008/08/repository-pattern.html

http://blog.fedecarg.com/2009/03/15/domain-driven-design-the-repository/

http://devlicio.us/blogs/casey/archive/2009/02/20/ddd-the-repository-pattern.aspx

http://en.wikipedia.org/wiki/Domain-driven_design

http://msdn.Microsoft.com/en-us/magazine/dd419654.aspx

2
javaDisciple

O DAO fornece abstração em arquivos de banco de dados/dados ou qualquer outro mecanismo de persistência para que a camada de persistência possa ser manipulada sem conhecer seus detalhes de implementação.

Enquanto que nas classes Repository, várias classes DAO podem ser usadas em um único método Repository para obter uma operação feita a partir da perspectiva do aplicativo. Portanto, em vez de usar vários DAO na camada de domínio, use o repositório para fazê-lo. Repositório é uma camada que pode conter alguns lógica do aplicativo como: Se os dados estiverem disponíveis no cache da memória, busque-os do cache, busque dados da rede e armazene-os no cache da memória para a próxima vez recuperação.

2
Rahul Rastogi

em uma frase muito simples: A diferença significativa é que os Repositórios representam coleções, enquanto os DAOs estão mais próximos do banco de dados, sendo muitas vezes mais centrados em tabelas.

0
Alireza Rahmani Khalili