[英]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.