InstancePerRequest DbContext ASP.NET MVC

本文关键字:MVC NET ASP DbContext InstancePerRequest | 更新日期: 2023-09-27 18:07:10

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

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

BService内部使用

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

尝试将IBService注册为单例。

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

显然,这会给我一个错误

在请求实例的作用域中,没有标记匹配'AutofacWebRequest'的作用域。

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

如何在单例服务中使用PerRequest DbContext

InstancePerRequest DbContext ASP.NET MVC

第一次尝试,你可以将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;
    }
}

每次,当你想在singletone中访问上下文时,它将把这个请求传递给IoC容器,IoC容器能够为每个请求返回上下文。