EF6 Code First mit generischem Repository und Dependency Injection und SoC
Nach vielem Lesen und Ausprobieren mitEntity Framework
neueste stabile Version (6.1.1).
Ich lese viele Widersprüche darüber, ob ich Repositorys mit @ verwenden soll oder nichEF6
oderEF
im Allgemeinen, weil es @ iDbContext
bietet bereits ein Repository undDbSet
dasUoW
, sofort einsatzbereit.
assen Sie mich zunächst erklären, was meine Lösung in Bezug auf das Projekt enthält, und dann werde ich auf den Widerspruch zurückkomme
s hat ein Klassenbibliotheksprojekt und einasp.net-mvc
project. Das class lib Projekt ist der Datenzugriff und woMigrations
sind aktiviert fürCode First
.
In meinem class lib Projekt habe ich ein generisches Repository:
public interface IRepository<TEntity> where TEntity : class
{
IEnumerable<TEntity> Get();
TEntity GetByID(object id);
void Insert(TEntity entity);
void Delete(object id);
void Update(TEntity entityToUpdate);
}
nd hier ist die Implementierung davo
public class Repository<TEntity> where TEntity : class
{
internal ApplicationDbContext context;
internal DbSet<TEntity> dbSet;
public Repository(ApplicationDbContext context)
{
this.context = context;
this.dbSet = context.Set<TEntity>();
}
public virtual IEnumerable<TEntity> Get()
{
IQueryable<TEntity> query = dbSet;
return query.ToList();
}
public virtual TEntity GetByID(object id)
{
return dbSet.Find(id);
}
public virtual void Insert(TEntity entity)
{
dbSet.Add(entity);
}
public virtual void Delete(object id)
{
TEntity entityToDelete = dbSet.Find(id);
Delete(entityToDelete);
}
public virtual void Update(TEntity entityToUpdate)
{
dbSet.Attach(entityToUpdate);
context.Entry(entityToUpdate).State = EntityState.Modified;
}
}
Und hier ein paar Entitäten:
public DbSet<User> User{ get; set; }
public DbSet<Order> Orders { get; set; }
public DbSet<UserOrder> UserOrders { get; set; }
public DbSet<Shipment> Shipments { get; set; }
Ich weiß nicht, was ich sagen soll, aber mitEF6
Sie übergeben keine Repositories mehr, aber dasDbContext
stattdessen. So fürDI
Ich habe im @ folgendes eingestelasp-net-mvc
project usingNinject
:
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<ApplicationDbContext>().ToSelf().InRequestScope();
}
Und dies wird das @ injizierApplicationDbContext
Über Konstruktorinjektion an Klassen der oberen Schicht, wo zutreffend.
un komme ich auf den Widerspruch zurüc
Wenn wir kein Repository mehr benötigen, weilEF
bietet das bereits im Auslieferungszustand an. Wie machen wir das?Separation of Concern
(im Titel mit SoC abgekürzt)?
Korrigieren Sie mich jetzt, wenn ich falsch liege, aber es hört sich für mich so an, als müsste ich nur die gesamte Datenzugriffslogik / -berechnung ausführen (wie Hinzufügen, Abrufen, Aktualisieren, Löschen und einige benutzerdefinierte Logik / Berechnungen hier und da (entitätsspezifisch) ) in demasp.net-mvc
project, wenn ich kein Repository hinzufüge.
Jedes Licht in dieser Angelegenheit wird wirklich geschätzt.