Combinant Unit of Work
et Repository Pattern
est quelque chose utilisé assez largement répandue de nos jours. Martin Fowler dit un but de l'utilisation d' UoW
est de former une Transaction d'Affaires tout en étant ignorants de la façon dont les référentiels de réellement travail (être persistant ignorants). J'ai passé en revue de nombreuses implémentations, et en ignorant les détails précis (concret/abstrait classe, interface,...), ils sont plus ou moins similaire à ce qui suit:
public class RepositoryBase<T>
{
private UoW _uow;
public RepositoryBase(UoW uow) // injecting UoW instance via constructor
{
_uow = uow;
}
public void Add(T entity)
{
// Add logic here
}
// +other CRUD methods
}
public class UoW
{
// Holding one repository per domain entity
public RepositoryBase<Order> OrderRep { get; set; }
public RepositoryBase<Customer> CustomerRep { get; set; }
// +other repositories
public void Commit()
{
// Psedudo code:
For all the contained repositories do:
store repository changes.
}
}
Maintenant mon problème:
UoW
expose méthode publique Commit
enregistrer les modifications. Aussi, parce que chaque référentiel a une instance partagée de l' UoW
chaque Repository
pouvez accéder méthode Commit
sur UoW. L'appeler par un référentiel qui rend toutes les autres référentiels de stocker leurs modifications; d'où le résultat de l'ensemble du concept de transaction s'effondre:
class Repository<T> : RepositoryBase<T>
{
private UoW _uow;
public void SomeMethod()
{
// some processing or data manipulations here
_uow.Commit(); // makes other repositories also save their changes
}
}
Je pense que ce ne doit pas être autorisé. Compte tenu de l'objectif de l' UoW
(transactions commerciales), la méthode de Commit
devraient être exposés à celui qui a commencé une Opération commerciale par exemple de la Couche de gestion. Ce qui m'a surpris, c'est que je ne pouvais pas trouver un article traitant de cette question. Dans tous Commit
peut être appelée par n'importe quel pensions être injecté.
PS: je sais que je peux dire à mes développeurs de ne pas appeler Commit
en Repository
mais faire confiance à l'Architecture est beaucoup plus fiable que de faire confiance aux développeurs!