Padrão de repositório x Entidades de gerenciamento do DAO


10

Eu sou novo em conceitos como DAO, DAL e Domain Driven Design. No final, quero dissociar a camada de persistência (banco de dados mysql) dos meus objetos de negócios e lógica em um aplicativo da web. Gostei do conceito DAO, mas fiquei preso ao implementá-lo quando quero criar um Objeto de Negócios a partir do banco de dados que tenha outras entidades associadas a ele (representadas por chave estrangeira na tabela db).

  1. Como essas referências (agregações) são tratadas usando o padrão DAO? Todo exemplo de DAO online é simples e mostra a criação apenas de Objetos de Negócios semelhantes a objetos de valor (sem referenciar outras entidades ou objetos de valor). Isso é feito usando a Injeção de Dependências e, em caso afirmativo, onde é criada a dependência?
  2. Ao ler mais , acho que o padrão de Repositório do DDD oferece a possibilidade de talvez usar DAOs nos bastidores e manipular agregações de objetos. Pelo que entendi, ele apenas fornece a chamada raiz (Entidade com todas as referências carregadas ou carregadas com preguiça) para o mundo exterior, o que parece uma boa abordagem para mim. É recomendado o Repositório ao usar o DAO ou os próprios DAOs podem fornecer essa funcionalidade, mantendo a Ignorância de Persistência nos Objetos de Negócios.

Não estou usando uma ferramenta ORM e não quero, pois gosto de explorar esses padrões básicos diretamente



Sry, achei que esta pergunta é mais adequada aqui. Eu o apago no stackoverflow.
Michbeckable

qual estrutura de linguagem você está usando? se você quiser exemplos concretos ... provavelmente também deve procurar as coisas de Martin Fawler sobre o assunto.
AK_


Padrões de arquitetura corporativa tem uma ótima seção sobre padrões de acesso a dados. Se bem me lembro, o Table Data Gateway de Fowler é análogo a um DAO; portanto, muitos dos padrões que ele descreve no livro foram implementados nas bibliotecas ORM.
Mike Partridge

Respostas:


4

Há duas preocupações com as quais lidar - ortogonais entre si:

1) O limite inferior da persistência

É aqui que você precisa lidar com conexões , consultas , conjuntos de resultados e similares. Geralmente, você usa uma ou outra estrutura que fornece uma fachada - padrão à mão, que abstrai as coisas sujas, para que você só diga o que deseja saber (Resultset from Query) e onde a estrutura pode encontrá-las ( Consulta e Conexão). O que você faz com o conjunto de resultados é com você.

Quando seu paradigma é OOP, há uma etapa adicional envolvida: montar o conjunto de resultados em objetos. Você faz isso manualmente ou tem um mapeador de objeto-relacional fazendo o trabalho para você.

2) A abstração no seu aplicativo No topo dessa camada de baixo nível, está a abstração com a qual o seu aplicativo lida. Existe o DataAccessObject (DAO) -Layer ou o Repository -Layer. Ambos geram objetos para o seu aplicativo trabalhar.

Qual deles você está usando não afeta a resposta da sua pergunta.

Sua pergunta, por um lado, é sobre modelagem ( »Como lidar com relacionamentos entre objetos« Resposta: via Composição / Agregação ) e sobre como preencher o objeto (e suas dependências) com dados.

Isso é feito usando a Injeção de Dependências e, em caso afirmativo, onde é criada a dependência?

Este é o caminho a percorrer. Existem duas maneiras:

1) Você torna o DI explícito e define um construtor. Ao criar o Objeto, você pode criar todas as dependências primeiro e injetá-las por injeção de construtor ou setter

2) Você usa uma estrutura que faz a mágica para você. Muitas vezes, a reflexão está envolvida, ou seja, existem possibilidades em algumas línguas para examinar e manipular objetos em tempo real. A injeção é feita de forma transparente para o usuário pela estrutura.

Isso é independente do padrão DAO / Repository.

Não estou usando uma ferramenta ORM e não quero, pois gosto de explorar esses padrões básicos diretamente

Essa é uma abordagem nobre, mas nem sempre produtiva. Na maioria das vezes, você quer fazer as coisas. Para fins educacionais, você pode seguir esse caminho. Mas eu não recomendaria.

Procure um ORM-Framework flexível, que oferece uma ajuda quando necessário, sem forçar você de uma maneira ou de outra. Nem sempre a consulta gerada ootB é eficaz. Uma boa estrutura permite que você use SQL quando necessário e cuida apenas da peça de montagem .


1

É aqui que o ORM (mapeamento objeto-relacional) é útil. Existem bibliotecas para muitas linguagens de programação que fornecem esse tipo de técnicas de programação. Por exemplo, para Java, há o Hibernate . O Hibernate funciona com anotações Java. Aqui está um exemplo simples para um relacionamento muitos para um a partir da documentação oficial :

@Entity
public class Flight implements Serializable {
    @ManyToOne(cascade={CascadeType.PERSIST, CascadeType.MERGE})
    @JoinColumn(name="COMP_ID")
    public Company getCompany() {
        return company;
    }
    ...
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.