Frage

Ich stellte vor einiger Zeit eine Frage, warum der Vergleich der Standardgleichheit nicht funktionierte, als ich zwei Sammlungen von Unternehmen war.

EF -Code zuerst - LINQ an Entities Union EqualityComparerer

Die Antwort war darauf zurückzuführen, dass ich zwei Differenzinstanzen meines DBContext verwendete, daher unterschiedliche Referenzen.

Jetzt versuche ich, meinen DBContent über die Anfrage zu teilen. Ich sehe ein paar "komplizierte" Beispiele, aber ich dachte, ich würde es für eine einfachere Lösung versuchen.

Also habe ich eine IDBContext -Schnittstelle erstellt, die einfach meine Entitäten beschreibt

public interface IDbContext {
   int SaveChanges();
   DbSet<News> News { get; set; }
   DbSet<Category> Categories { get; set; }
}

Mein DBContext wird dann so implementiert:

public class SiteContext : DbContext, IDbContext {
   public DbSet<News> News { get; set; }
   public DbSet<Category> Categories { get; set; }

   protected override void OnModelCreating(DbModelBuilder modelBuilder) {
      ...
   }
}

Dann habe ich in meinen beiden Repositories (Newsrepository und CategoryRespository) den IDBContext als Konstruktorparameter

IDbContext _db;

public NewsRepository(IDbContext db) {
    _db = db;
}

Ich gehe jetzt davon aus, dass, wenn ich IDBContext an SiteContext in dem Anforderungsbereich binden, dass meine Repositories denselben Kontext teilen?

 kernel.Bind<IDbContext>().To<SiteContext>().InRequestScope();

Wenn ich meine Gewerkschaft jedoch erneut aus der vorherigen Frage versuche, erhalte ich immer noch doppelte Einheiten! Was mache ich falsch? Wie kann ich feststellen, ob ich definitiv den gleichen Kontext in einer Anfrage verwende?

War es hilfreich?

Lösung

Denn wenn jedes Repository konstruiert ist, bietet Ninject Will Ihnen eine neue Instanz von SiteContext pro Repository. Deshalb funktioniert es nicht. Es ist eine gute Idee, eine Implementierung von UnitOfwork zu verwenden, was bedeutet, dass alle Repositorys denselben Kontext verwenden.
Das Unitofwork würde einen IDBContext für den Bau aufnehmen.

So etwas würde funktionieren

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;
         }    
}

Andere Tipps

Um die Lösung von Feanz zu verbessern, würde ich immer noch Eigentumseinspritzung des Inewsrepository mit Ninject durchführen:

[Inject]
public INewsRepository NewsRepo {get;set;}

Jedes Mal, wenn ein Iunitofwork erstellt wird, wird auch ein InewsRepository erstellt. Dies muss weiterhin Ihren Ninjektbindungen hinzugefügt werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top