J'ai implémenté un modèle de référentiel avec une ignorance de persistance. L'implémentation du référentiel n'interagit qu'avec mes objets d'entité, IUnitOfWork
et ITable<T>
. L'intention est que le IUnitOfWork
ne soit pas réutilisé mais représente une seule transaction. Jusqu'à présent, j'ai implémenté en-mémoire ainsi que Linq-to-Sql des versions IUnitOfWork
et ITable<T>
.Quel motif de conception pour localiser mon IUnitOfWork?
Mon problème est que, en raison de l'injection IUnitOfWork
dans le référentiel, je finis avec besoin de savoir comment instancier une nouvelle IUnitOfWork
où que le dépôt est utilisé. Puisque c'est la pièce principale qui est supposée être connectable, j'ai l'impression d'avoir fait quelque chose de mal. Le modèle d'utilisation général est quelque chose comme ceci:
FooUnitOfWork unitOfWork = new FooUnitOfWork();
Repository repos = new Repository(unitOfWork);
// ...act upon repos
unitOfWork.Save();
Maintenant, il semble que j'ai besoin d'un autre modèle pour permettre à chaque utilisation du référentiel dans l'application pour obtenir l'unité correcte du travail (par exemple en mémoire, L2S, etc.).
Quel est le modèle le plus approprié pour cela? J'ai regardé Fowler's discussion on the topic mais aucun de ses exemples ne semble être un ajustement propre. Je me sens déjà comme la quantité d'abstraction que j'ai est plus que ce que je voudrais pour construire encore une autre indirection semble excessive. À l'heure actuelle, je me tourne vers un fournisseur d'application qui peut être configuré pour produire le bon IUnitOfWork
. Suis-je hors-base ou est-ce ce qui est nécessaire pour être vraiment agnostique de mise en œuvre?
Eh bien, vous avez besoin d'un contexte pour associer l'unité de travail (comme un thread ou httpcontext), vous devez ensuite utiliser une méthode usine pour obtenir l'unité de travail (vs new()). – meandmycode
Une méthode d'usine statique (soutenue par un contexte de thread) serait une interface propre pour l'instanciation. Que diriez-vous de configurer la configuration (contexte DB, etc) que je configure actuellement dans les constructeurs 'UnitOfWork'? – mckamey
Je voudrais gérer cela dans certains endroits autoritaire, si cela était une application web par exemple ..vous manipulez BeginRequest et créez une unité de travail (en transmettant toutes vos dépendances et config), puis enregistrez-le quelque part (le plus simple serait soit des membres d'instance dans le global, soit dans la collection Items), vous auriez alors une usine méthode (ou quelque chose de similaire) qui sait où chercher l'instance de l'unité de travail ... vous pouvez travailler pour faire quelque chose de beaucoup plus sophistiqué mais tout ce que vous faites est de mettre en place un service ... – meandmycode