O Padrão de Repositório e o Padrão de Registro Ativo são compatíveis?

5

Atualmente estou desenvolvendo um webapp onde defini modelos que implementam o padrão Active Record. Cada modelo também é definido por uma interface que especifica as propriedades da Entidade e facilita a injeção em outras classes, especialmente útil para testes de unidade. Estou ansioso para implementar cada modelo com um padrão Repositório para abstrair a implementação do banco de dados.

por exemplo. Artigo:

ArticleInterface
- title
- content

ArticleRepositoryInterface
- getArticle(title)
- saveArticle(ArticleInterface)

ArticleRepository implements ArticleRepositoryInterface
- constructor(ArticleInterface)
- ArticleInterface getArticle(title)
- saveArticle(ArticleInterface)

Article implements ArticleInterface extends ActiveRecordModel

Ambos os padrões são muito populares nos atuais frameworks de desenvolvimento web, mas não está claro para mim como integrá-los. O padrão Active Record por definição envolve uma linha em uma tabela de banco de dados, encapsula o acesso ao banco de dados , mapeando cada propriedade de objeto para uma tabela de banco de dados, portanto

  • como você deve integrar cada repositório de modelo com o modelo que implementa o AR?

  • Existem alternativas ao uso de um modelo que implementa o AR, herdando todos os métodos de banco de dados e injetando-o em um Repositório envolvendo todos os métodos de banco de dados do AR?

  • Quais são as melhores práticas neste cenário?

Se adicionar qualquer contexto a essa pergunta, estou usando Laravel e Eloquente .

    
por marcanuy 25.05.2015 / 00:58
fonte

2 respostas

4

O padrão do repositório:

Mediates between the domain and data mapping layers using a collection-like interface for accessing domain objects.

A camada de mapeamento de dados que você escolheu é o Active Record. Ergo, o Repositório é aquele padrão de software que fornece uma camada adicional de abstração entre o padrão do seu Active Record e o domínio do seu negócio.

How should you integrate each model repository with the model that implements the AR?

Ao fornecer métodos que retornam uma interface semelhante a uma coleção para o seu domínio de negócios, use o Active Record para recuperar os resultados necessários do banco de dados.

Are there any alternatives to using a model that implements the AR, inheriting all the database methods, and injecting it into a Repository wrapping all the AR database methods?

Você pode usar algum outro método para acessar o banco de dados, como o Gateway de Dados de Tabela, o Gateway de Dados de Linha ou o Mapeador de Dados, no lugar do Active Record.

What are the best practices in this scenario?

As práticas que melhor atendem aos requisitos funcionais e não funcionais de seu software em termos de desempenho e facilidade de manutenção.

    
por 25.05.2015 / 01:08
fonte
3

A grande diferença entre os padrões Active Record e Repository é, na minha opinião, o proprietário do link entre a instância da entidade e o armazenamento subjacente:

  • no Active Record, a instância da entidade sabe como e onde persistir (isso é o que "ativo" significa em minha mente). É por isso que você pode simplesmente chamar user.save () e ele persiste.
  • no padrão Repositório, a entidade é POJO mais ou menos idiota, é o repositório que gerencia seu ciclo de vida. Se você criar uma nova instância da entidade, ela não é magicamente persistida, você precisa dizer ao repositório para persistir.

O Active Record é mais simples, mas menos flexível, porque é anexado a um armazenamento de apoio.

Em relação a quem gerencia o ciclo de vida da entidade, você precisa escolher um ou outro.

Mas, além disso, você pode criar uma espécie de híbrido - por exemplo, suas entidades gerenciam a si mesmas (ou seja, Active Record - > métodos como .save () e .delete ()), mas você tem um repositório que fornece a funcionalidade de consulta e mapeamento sem rastrear entidades "gerenciadas" (e sem métodos como. saveArticle ()).

    
por 25.05.2015 / 16:51
fonte