在ASP.NET MVC应用程序中将DbContext注册为InstancePerRequest。 (IoC Autofac

builder.RegisterType<ADbContext>().As<IADbContext>().InstancePerRequest();


BService内部使用

public class BService : IBService
{
    readonly IADbContext _dbContext;
    public BService(IADbContext dbContext)
    {
        _dbContext = dbContext;
    }
}


尝试将IBService注册为Singleton。

builder.RegisterType<BService>().As<IBService>().SingleInstance();


显然,这给了我一个错误


  从请求实例的范围中看不到带有匹配“ AutofacWebRequest”标签的范围。


最简单的解决方案是将IBService注册为InstancePerRequest,但是没有理由拥有PerRequest IBService,而不是上面提到的错误消息。

我如何在Singleton服务中使用PerRequest DbContext

最佳答案

第一次尝试,您可以将IContainer注入BService。但这看起来像服务定位器模式,这不是很好。否则,您可以定义工厂接口

public interface IFactory<T>
{
    T GetInstance();
}


然后实施并注册

public class SimpleFactory<T> : IFactory<T>
{
    private IContainer _container;

    public SimpleFactory(IContainer container)
    {
        _container = container;
    }

    public T GetInstance()
    {
        return _container.Resolve<T>();
    }
}

public class DbContextFactory : SimpleFactory<IADbContext>
{
    public DbContextFactory(IContainer container):base(container)
    {
    }
}


最后,在您的单调中使用此工厂

public class BService : IBService
{
    IADbContext _dbContext =>  _dbContextFactory.GetInstance();
    IFactory<IADbContext> _dbContextFactory

    public BService(IFactory<IADbContext> dbContextFactory)
    {
        _dbContextFactory = dbContextFactory;
    }
}


每次,当您想访问单调内的上下文时,它将将此请求传递给IoC容器,该容器能够按请求返回上下文。

08-28 12:46