【问题标题】:Inject DbContext with Autofac使用 Autofac 注入 DbContext
【发布时间】:2015-04-10 11:28:11
【问题描述】:

我有以下 EntityFramework 上下文:

public class Context : DbContext, IDbContext {
}

其中 IDbContext 如下:

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

使用 Autofac 配置 DbContext 注入的正确方法是什么?

使用 StructureMap 我有以下内容:

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

【问题讨论】:

    标签: entity-framework autofac


    【解决方案1】:

    多种方式,取决于您需要的范围、约定等。

    例子:

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

    【讨论】:

    • Gorgon:是否有理由使用 AsImplementedInterfaces() 而不是指定接口,例如 As?为什么不使用 InstancePerRequest()?谢谢。
    • 明确指定接口是可以的。这是一个品味、惯例、纪律等问题(我更喜欢有惯例的自动魔法)。 InstancePerRequest() 如果您严格处于网络环境中,则很好,但否则将无法正常工作。 InstancePerLifetimeScope() 假设您知道范围并通过某种方式自己控制它(例如,在批处理作业中为每个线程创建一个)。
    【解决方案2】:

    假设您的构造函数期望接收 DbContext 工厂 Func&lt;IDbContext&gt; 因此您将能够在每次调用时获取新的 DbContext 实例并自行处理它们,您应该使用:

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

    您可能想看看https://autofac.readthedocs.io/en/latest/resolve/relationships.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-12
      • 1970-01-01
      • 1970-01-01
      • 2020-07-14
      • 1970-01-01
      • 2014-12-15
      • 1970-01-01
      相关资源
      最近更新 更多