InstancePerRequest DbContext ASP.NET MVC
本文关键字:MVC NET ASP DbContext InstancePerRequest | 更新日期: 2023-09-27 18:07:10
在ASP中注册DbContext。. NET MVC应用程序作为InstancePerRequest
。(IoC Autofac
)
builder.RegisterType<ADbContext>().As<IADbContext>().InstancePerRequest();
在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
而不是上面提到的错误消息。
如何在单例服务中使用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;
}
}
每次,当你想在singletone中访问上下文时,它将把这个请求传递给IoC容器,IoC容器能够为每个请求返回上下文。