Miguel Moura
Miguel Moura

Reputation: 39444

Inject DbContext with Autofac

I have the following EntityFramework context:

public class Context : DbContext, IDbContext {
}

Where IDbContext is the following:

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

What is the correct way to configure DbContext injection with Autofac?

With StructureMap I had the following:

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

Upvotes: 13

Views: 22639

Answers (2)

Nir
Nir

Reputation: 2054

Assuming that your constructor expects to receive a DbContext factory Func<IDbContext> so you'll be able to get new instances of DbContext on each call and dispose them on your own, you should use:

builder.RegisterType<Context>().AsImplementedInterfaces().InstancePerDependency().ExternallyOwned();

You might want to take a look at https://autofac.readthedocs.io/en/latest/resolve/relationships.html

Upvotes: 0

Jacek Gorgoń
Jacek Gorgoń

Reputation: 3214

Many ways, depending on scope you need, conventions etc.

Example:

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

Upvotes: 17

Related Questions