簡體   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