Il pattern di Repository Pattern e Active Record è compatibile?

5

Attualmente sto sviluppando una webapp in cui ho definito modelli che implementano il pattern Active Record. Ogni modello è inoltre definito da un'interfaccia che specifica le proprietà delle entità e rende facile l'iniezione in altre classi, particolarmente utile per il test delle unità. Non vedo l'ora di implementare ogni modello con un modello di repository per astrarre l'implementazione del database.

per es. Articolo:

ArticleInterface
- title
- content

ArticleRepositoryInterface
- getArticle(title)
- saveArticle(ArticleInterface)

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

Article implements ArticleInterface extends ActiveRecordModel

Entrambi i pattern sono molto popolari negli attuali framework di sviluppo web, ma non mi è chiaro come integrarli. Il pattern Active Record per definizione avvolge una riga in una tabella di database, incapsula l'accesso al database , mappando ogni proprietà dell'oggetto su una tabella di database, quindi

  • come dovresti integrare ciascun repository di modelli con il modello che implementa l'AR?

  • Esistono alternative all'utilizzo di un modello che implementa l'AR, ereditando tutti i metodi del database e inserendolo in un repository che include tutti i metodi del database AR?

  • Quali sono le migliori pratiche in questo scenario?

Se aggiunge un contesto a questa domanda, sto utilizzando Laravel e Eloquent .

    
posta marcanuy 25.05.2015 - 00:58
fonte

2 risposte

4

Il modello del repository:

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

Il livello di mappatura dei dati che hai scelto è Active Record. Ergo, il repository è quel modello software che fornisce un ulteriore livello di astrazione tra il tuo pattern Active Record e il tuo dominio aziendale.

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

Fornendo metodi che restituiscono un'interfaccia tipo raccolta al dominio aziendale, utilizzando Active Record per recuperare i risultati necessari dal database.

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?

È possibile utilizzare un altro metodo per accedere al database, come Table Data Gateway, Row Data Gateway o Data Mapper, al posto di Active Record.

What are the best practices in this scenario?

Quelle pratiche che soddisfano al meglio i requisiti funzionali e non funzionali del tuo software in termini di prestazioni e manutenibilità.

    
risposta data 25.05.2015 - 01:08
fonte
3

La grande differenza tra i pattern Active Record e Repository è a mio parere il proprietario del collegamento tra l'istanza dell'entità e lo storage sottostante:

  • in Active Record, l'istanza dell'entità sa come e dove persistere (questo è ciò che significa "attivo" nella mia mente). Ecco perché puoi semplicemente chiamare user.save () e persiste.
  • nel modello di repository, l'entità è POUO più o meno stupida, è il repository che ne gestisce il ciclo di vita. Se crei una nuova istanza dell'entità, non è magicamente persistente, devi dire al repository di mantenerla.

Active Record è più semplice ma meno flessibile perché è collegato a una sola copia di riserva.

Riguardo a chi gestisce il ciclo di vita dell'entità, è necessario scegliere l'uno o l'altro.

Ma a parte questo puoi creare una sorta di ibrido, ad es. le tue entità si gestiscono da sole (ad es. Active Record - > metodi come .save () e .delete ()), ma poi hai un repository che fornisce funzionalità di interrogazione e mappatura senza tenere traccia delle entità "gestite" (e senza metodi come. saveArticle ()).

    
risposta data 25.05.2015 - 16:51
fonte