Repository e unità di lavoro - che è responsabile di cosa?
-
02-10-2019 - |
Domanda
Durante la scorsa settimana o giù di lì ho letto un sacco di articoli e tutorial per quanto riguarda il modello di repository. Molti degli articoli strettamente legare il modello repository all'unità di modello di lavoro. In questi articoli, di solito trovo codice simile a questo:
interface IUnitOfWork<TEntity>
{
void RegisterNew(TEntity entity);
void RegisterDirty(TEntity entity);
void RegisterDeleted(TEntity entity);
void Commit();
void Rollback();
}
interface IRepository<TKey, TEntity>
{
TEntity FindById(TKey id);
IEnumerable<TEntity> FindAll();
void Add(TEntity entity);
void Update(TEntity entity);
void Delete(TEntity entity);
}
class Repository : IRepository<int, string>
{
public Repository(IUnitOfWork<string> context)
{
this.context = context;
}
private IUnitOfWork<string> context;
public void Add(string entity)
{
context.RegisterNew(entity);
}
public void Update(string entity)
{
context.RegisterDirty(entity);
}
public void Delete(string entity)
{
context.RegisterDeleted(entity);
}
/* Entity retrieval methods */
}
I Am comprendere correttamente che l'unità dell'oggetto lavoro ha lo scopo di gestire l'aggiunta, l'aggiornamento o la cancellazione di qualsiasi oggetto nell'archivio dati sottostante (nel mio caso, un servizio di directory, che comunico con via LDAP)? Se questo è vero, non dovrebbe gestire il recupero di tutti gli oggetti come bene? Perché è che non parte dell'interfaccia UoW suggerito?
Soluzione
Un Repository
è responsabile dei dati - ottenerlo, l'aggiornamento e le altre operazioni CRUD, fornendo la persistenza ignoranza.
A Unit Of Work
(UOW), come dice Marin Fowler:
Mantiene un elenco di oggetti colpiti da una transazione commerciale e coordina la scrittura di modifiche e la risoluzione dei problemi di concorrenza.
L'UOW coordinerà più operazioni sugli oggetti -. Può o non può utilizzare repository per persistenti questi cambiamenti