EF DbContext e Ninject
-
26-10-2019 - |
Domanda
Ho fatto una domanda un po 'indietro sul perché il confronto uguaglianze predefinito non sembra funzionare quando ero sindacali due collezioni di entità.
EF Codice Prima - LINQ to Entities dell'Unione EqualityComparer
La risposta è stata dovuta al fatto che stavo usando due istanze di differenza di mia DbContext quindi diversi riferimenti.
Così ora sto cercando di condividere la mia DbContent tutta la richiesta. Vedo alcuni esempi "complicato", ma ho pensato di provare per una soluzione più semplice.
Così ho creato un'interfaccia IDbContext che delinea semplicemente i miei Enti
public interface IDbContext {
int SaveChanges();
DbSet<News> News { get; set; }
DbSet<Category> Categories { get; set; }
}
Il mio DbContext viene poi implementare in questo modo:
public class SiteContext : DbContext, IDbContext {
public DbSet<News> News { get; set; }
public DbSet<Category> Categories { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder) {
...
}
}
Poi, nei miei due repository (NewsRepository e CategoryRespository) ho l'IDbContext come costruttore parametro
IDbContext _db;
public NewsRepository(IDbContext db) {
_db = db;
}
Ora presumo che se mi legano a IDbContext SiteContext nel campo di applicazione richiesta di mio repository condivideranno lo stesso contesto?
kernel.Bind<IDbContext>().To<SiteContext>().InRequestScope();
Tuttavia, quando provo di nuovo la mia unione dalla domanda precedente ho ancora ricevuto le entità duplicate! Quello che sto facendo male? Come faccio a sapere se sto sicuramente usando lo stesso contesto in una richiesta?
Soluzione
Perché quando ogni repository è costruito Ninject vi sta fornendo voi con una nuova istanza di SiteContext per ogni repository. Ecco perché la sua non funziona. E 'una buona idea di utilizzare un'implementazione unitofwork il che significa che tutti i repository utilizzano lo stesso contesto.
L'UnitOfWork prenderebbe in un IDbContext sulla costruzione.
Qualche cosa come questa funzionerebbe
private IDbContext _context;
public UnitOfWork(IDbContext context)
{
_context = context
}
private _INewsRepository;
public INewsRepoitory
{
get{
if(_INewsRepository == null)
{
_INewsRepository = new NewsREpository(_context);
return _INewsRepository;
}
else
{
return _INewsRepository;
}
}
Altri suggerimenti
Per migliorare la soluzione di feanz vorrei ancora fare l'iniezione di proprietà del INewsRepository con Ninject:
[Inject]
public INewsRepository NewsRepo {get;set;}
Ogni volta che viene creato un IUnitOfWork c'è anche un INewsRepository creato. Questo deve ancora essere aggiunto ai tuoi attacchi Ninject.