InstancePerRequest DbContext ASP.NET MVC

时间:2016-09-15 10:26:28

标签: c# asp.net asp.net-mvc entity-framework asp.net-mvc-4

将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();

显然,这给了我一个错误

  

没有标记匹配的范围&#39; AutofacWebRequest&#39;从请求实例的范围可见。

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

如何在Singleton服务中使用PerRequest DbContext

1 个答案:

答案 0 :(得分:1)

首次尝试,您可以将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容器,该容器能够按请求返回上下文。