2015-04-10 3 views
6

Ho il seguente EntityFramework contesto:Iniettare DbContext con Autofac

public class Context : DbContext, IDbContext { 
} 

Dove IDbContext è la seguente:

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 

Qual è il modo corretto per configurare l'iniezione DbContext con Autofac?

Con StructureMap ho avuto i seguenti:

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

risposta

11

Molti modi, a seconda del campo di applicazione è necessario, convenzioni ecc

Esempio:

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

Gorgon: C'è una ragione per l'utilizzo di AsImplementedInterfaces() invece di specificare l'interfaccia, ad es., Come ? E perché non usare InstancePerRequest()? Grazie. –

+5

La specifica delle interfacce è esplicita. È una questione di gusti, convenzioni, disciplina, ecc. (Preferisco le cose automagiche con le convenzioni). InstancePerRequest() va bene se sei strettamente in un contesto web, ma non funzionerà diversamente. InstancePerLifetimeScope() presume che tu sia a conoscenza dell'ambito e lo controlli in qualche modo te stesso (ad esempio, creane uno per thread in un processo batch). –