繁体   English   中英

InstancePerRequest DbContext ASP.NET MVC

[英]InstancePerRequest DbContext ASP.NET MVC

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

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

BService内部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而不是上面提到的错误消息。

如何在 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 容器,该容器能够返回每个请求的上下文。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM