将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();
显然,这给了我一个错误
没有标记匹配的范围&#39; AutofacWebRequest&#39;从请求实例的范围可见。
最简单的解决方案是将IBService
注册为InstancePerRequest
,但没有理由使用PerRequest IBService
而不是上面提到的错误消息。
如何在Singleton服务中使用PerRequest
DbContext
?
答案 0 :(得分:1)
首次尝试,您可以将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容器,该容器能够按请求返回上下文。