Repository Pattern vs DAL

Sont-ils la même chose? Juste fini de regarder le tutoriel Storefront de Rob Connery et ils semblent être des techinques similaires. Je veux dire, quand j’implémente un object DAL, j’ai les méthodes GetStuff, Add / Delete etc et j’écris toujours l’interface en premier pour pouvoir changer de firebase database plus tard.

Est-ce que je confonds les choses?

Vous n’êtes certainement pas celui qui confond les choses. 🙂

Je pense que la réponse à la question dépend de combien de puriste vous voulez être.

Si vous voulez un sharepoint vue ssortingct de DDD, cela vous amènera dans une voie. Si vous regardez le référentiel comme un modèle qui nous a aidé à standardiser l’interface de la couche qui sépare les services et la firebase database, vous en descendez un autre.

De mon sharepoint vue, le référentiel n’est qu’une couche d’access aux données clairement spécifiée. Ou, en d’autres termes, une manière standardisée d’implémenter votre couche d’access aux données. Il existe des différences entre les différentes implémentations de référentiels, mais le concept est le même.

Certaines personnes placeront plus de contraintes DDD sur le référentiel tandis que d’autres utiliseront le référentiel comme médiateur entre la firebase database et la couche de service. Un référentiel comme une DAL isole la couche de service des spécificités de l’access aux données.

Un problème d’implémentation qui semble les rendre différents est qu’un référentiel est souvent créé avec des méthodes prenant une spécification. Le référentiel renverra des données conformes à cette spécification. La plupart des DAL traditionnelles que j’ai vues auront un ensemble plus large de méthodes où la méthode prendra un nombre quelconque de parameters. Bien que cela puisse sembler une petite différence, c’est un gros problème lorsque vous entrez dans les domaines de Linq et d’Expressions. Notre interface de référentiel par défaut ressemble à ceci:

public interface IRepository : IDisposable { T[] GetAll(); T[] GetAll(Expression> filter); T GetSingle(Expression> filter); T GetSingle(Expression> filter, List>> subSelectors); void Delete(T entity); void Add(T entity); int SaveChanges(); DbTransaction BeginTransaction(); } 

Est-ce un DAL ou un référentiel? Dans ce cas, je suppose que c’est les deux.

Kim

Un référentiel est un modèle qui peut être appliqué de différentes manières, tandis que la couche d’access aux données a une responsabilité très claire: la DAL doit savoir comment se connecter à votre stockage de données pour effectuer des opérations CRUD.

Un référentiel peut être une DAL, mais il peut également se placer devant la couche DAL et servir de pont entre la couche d’object métier et la couche de données. La mise en œuvre utilisée variera d’un projet à l’autre.

Une grande différence est qu’un DAO est un moyen générique de gérer la persistance pour toute entité de votre domaine. En revanche, un référentiel ne traite que des racines agrégées.

Je cherchais une réponse à une question similaire et je suis d’accord avec les deux réponses les mieux classées. En essayant de clarifier ceci pour moi-même, j’ai trouvé que si les spécifications, qui vont de pair avec le modèle de référentiel, sont implémentées en tant que membres de première classe du modèle de domaine, alors je peux

  • réutiliser les définitions de spécifications avec différents parameters,
  • manipuler les parameters des instances de spécification existantes (par exemple pour se spécialiser),
  • les combiner ,
  • exécuter la logique métier sur eux sans jamais avoir à accéder aux bases de données,
  • et, bien sûr, les tester indépendamment des implémentations réelles du référentiel.

Je peux même aller aussi loin et déclarer que si le modèle de référentiel n’est pas utilisé avec le modèle de spécification, ce n’est pas vraiment un “référentiel”, mais une DAL. Un exemple artificiel en pseudo-code:

 specification100 = new AccountHasMoreOrdersThan(100) specification200 = new AccountHasMoreOrdersThan(200) assert that specification200.isSpecialCaseOf(specification100) specificationAge = new AccountIsOlderThan('2000-01-01') combinedSpec = new CompositeSpecification( SpecificationOperator.And, specification200, specificationAge) for each account in Repository.GetAllSatisfying(combinedSpec) assert that account.Created < '2000-01-01' assert that account.Orders.Count > 200 

Voir l’essai de spécification de Fowler pour plus de détails (c’est ce que j’ai basé ci-dessus).

Un DAL aurait des méthodes spécialisées comme

 IoCManager.InstanceFor() .GetAccountsWithAtLeastOrdersAndCreatedBefore(200, '2000-01-01') 

Vous pouvez voir comment cela peut rapidement devenir encombrant, d’autant plus que vous devez définir chacune des interfaces DAL / DAO avec cette approche et implémenter la méthode de requête DAL.

Dans .NET, les requêtes LINQ peuvent constituer un moyen d’implémenter les spécifications, mais la combinaison de Specification (expressions) peut ne pas être aussi fluide qu’avec une solution locale. Certaines idées sont décrites dans cette question SO .

Mon opinion personnelle est que tout est question de cartographie, voir: http://www.martinfowler.com/eaaCatalog/repository.html . La sortie / entrée du référentiel est donc un object de domaine qui, sur la DAL, peut être n’importe quoi. Pour moi, c’est un ajout / une ressortingction important, car vous pouvez append une implémentation de référentiel pour une firebase database / un service / un autre avec une disposition différente, et vous avez un endroit clair pour vous concentrer sur le mappage. Si vous ne deviez pas utiliser cette ressortingction et disposer du mappage ailleurs, avoir différentes façons de représenter les données peut avoir un impact sur le code là où il ne devrait pas changer.

Tout est question d’interprétation et de contexte. Ils peuvent être très similaires ou très différents, mais tant que la solution fait le travail, ce qui est dans un nom!

L’avantage d’utiliser un modèle de référentiel est de simuler votre couche d’access aux données, de sorte que vous puissiez tester votre code de couche métier sans appeler le code DAL. Il y a d’autres gros avantages, mais cela me semble très important.

D’après ce que je comprends, ils peuvent signifier essentiellement la même chose – mais la dénomination varie en fonction du contexte.

Par exemple, vous pourriez avoir une classe Dal / Dao qui implémente une interface IRepository.

Dal / Dao est un terme de couche de données; les niveaux supérieurs de votre application pensent en termes de référentiels.

Donc, dans la plupart des cas (simples), DAO est une implémentation de Repository?

Si je comprends bien, il semble que DAO traite précisément de l’access à la firebase database (CRUD – No selects ?!) alors que Repository vous permet d’abstraire tout l’access aux données, peut-être une façade pour plusieurs DAO (peut-être différentes sources de données).

Suis-je sur le bon chemin?

Dans le monde externe (le code client), le référentiel est identique à DAL, sauf:

(1) ses méthodes d’insertion / mise à jour / suppression sont limitées pour avoir l’object conteneur de données comme paramètre.

(2) pour les opérations de lecture, il peut s’agir d’une spécification simple telle qu’une DAL (par exemple GetByPK) ou une spécification avancée.

En interne, il fonctionne avec une couche de mappage de données (par exemple, un contexte de structure d’entité, etc.) pour effectuer l’opération CRUD proprement dite.

Quel modèle de référentiel ne signifie pas: –

En outre, j’ai souvent vu des gens avoir de la difficulté à avoir une méthode Save séparée comme exemple d’implémentation de modèle de référentiel en dehors des méthodes Insert / Update / Delete qui valide toutes les modifications en mémoire effectuées par les méthodes insert / update / delete. Nous pouvons certainement avoir une méthode Save dans un référentiel, mais ce n’est pas la responsabilité du référentiel d’isoler les méthodes CUD (Create, Update, Delete) et de persistance en mémoire (qui exécutent l’opération actuelle d’écriture / modification dans la firebase database). responsabilité du modèle d’unité de travail.

J’espère que cela t’aides!

Le référentiel est un modèle, c’est un moyen d’implémenter les choses de manière standardisée pour réutiliser le code comme vous le pouvez.