Oggi ho discusso con il nostro architetto sulla scrittura usando le istruzioni in WorkUnits.
Supponiamo di avere un oggetto PersonWork con metodi:
public class PersonWorkUnit
{
private IContextFactory contextFactory;
private IRepositoryFactory repositoryFactory;
public PersonWorkUnit(IContextFactory contextFactory, IRepositoryFactory repositoryFactory)
{
this.contextFactory = contextFactory;
this.repositoryFactory = repositoryFactory;
}
public Person Get(int id)
{
using(var context = this.contextFactory.Create<IPersonContext>())
{
var personRepo = this.repositoryFactory.Create<IPersonRepository>(context);
return personRepo.Get(id);
}
}
}
Ciò che non gli piace è che dobbiamo scrivere using(var context = this.contextFactory.Create<IPersonContext>()) { var personRepo = this.repositoryFactory.Create<IPersonRepository>(context);
in ogni metodo di WorkUnit.
La mia opinione è che sia bello scrivere (e leggere) in ogni metodo, perché è possibile vedere in modo esplicito la durata del contesto e ciò che viene fatto durante, o prima / dopo il contesto. E se hai un negozio dove hai bisogno di più repository.
La sua opinione è che è sbagliato "duplicare" questo codice in ogni metodo della classe e vuole "nasconderlo" in un aspetto a livello di metodo (attributo).
Qual è la tua opinione su questo argomento?
Non vedo l'ora di approfondimenti e ragioni / vantaggi / svantaggi per le soluzioni.
Grazie in anticipo
Modifica: per rispondere ad alcune domande
- Che cos'è un contesto?
Con contesto intendo un'entità framework DbContext - Perché avere un ContextFactory?
Voglio avere una fabbrica quindi non honew PersonContext()
e posso prendere in giro DbContext nei test di accettazione con InMemoryDbContext - Cos'è un repository?
Repository (e solo repository) sono responsabili dell'accesso al database (DbContexts) - Che cos'è una work unit? In WorkUnits abbiamo metodi che corrispondono a casi d'uso. Un caso d'uso potrebbe aver bisogno di più (diversi) repository. In un metodo WorkUnit ci potrebbe essere qualcosa di più di una semplice chiamata a un repository ... l'esempio sopra è semplificato
- Perché non usare ContextFactory nei repository? Poiché alcuni casi d'uso richiedono più repository e voglio che usino lo stesso contesto, in modo che se qualcosa fallisce, l'intera transazione viene ripristinata