2015-04-10 23 views
6

Ich habe folgendes EntityFramework Kontext:Inject DbContext mit Autofac

public class Context : DbContext, IDbContext { 
} 

Wo IDbContext ist die folgende:

public interface IDbContext { 
    DbEntityEntry Entry(Object entity); 
    IEnumerable<DbEntityValidationResult> GetValidationErrors(); 
    Int32 SaveChanges(); 
    Task<Int32> SaveChangesAsync(); 
    Task<Int32> SaveChangesAsync(CancellationToken cancellationToken); 
    DbSet Set(Type entityType); 
    DbSet<TEntity> Set<TEntity>() where TEntity : class; 
} // IDbContext 

Was ist der richtige Weg DbContext Injektion mit Autofac zu konfigurieren?

Mit StructureMap hatte ich die folgenden:

For<IDbContext>().Use(x => new Context()); 

Antwort

11

Viele Wege, auf Umfang ab, die Sie benötigen, Konventionen usw.

Beispiel:

containerBuilder 
    .RegisterType<Context>() 
    .AsImplementedInterfaces() 
    .InstancePerLifetimeScope(); 
+1

Gorgon: Gibt es einen Grund für die Verwendung von AsImplementedInterfaces() anstelle der Angabe der Schnittstelle, z. B. als ? Und warum nicht IncidentPerRequest() verwenden? Danke. –

+5

Die Angabe der Schnittstelle (n) ist ausdrücklich zulässig. Es ist eine Frage des Geschmacks, der Konventionen, der Disziplin usw. (ich bevorzuge automagisches Zeug mit Konventionen). InstancePerRequest() ist in Ordnung, wenn Sie sich ausschließlich im Web-Kontext befinden, aber ansonsten nicht funktionieren. InstancePerLifetimeScope() geht davon aus, dass Sie den Bereich kennen und ihn auf irgendeine Weise selbst steuern (z. B. einen pro Thread in einem Stapeljob erstellen). –