在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();
显然,这给了我一个错误
从请求实例的范围中看不到带有匹配“ 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容器,该容器能够按请求返回上下文。