gpt4 book ai didi

c# - InstancePerRequest DbContext ASP.NET MVC

转载 作者:太空宇宙 更新时间:2023-11-03 12:39:39 24 4
gpt4 key购买 nike

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

显然,这给了我一个错误

No scope with a tag matching 'AutofacWebRequest' is visible from the scope in which the instance was requested.

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

如何在 Singleton 服务中使用 PerRequest DbContext

最佳答案

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

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 容器,后者能够根据请求返回上下文。

关于c# - InstancePerRequest DbContext ASP.NET MVC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39508762/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com