使用 Autofac 管理生命周期范围
Managing Lifetime Scopes with Autofac
上下文:Owin(自托管)+ WebApi + UseAutofacMiddleware + UseAutofacWebApi
我想做的是:
在应用程序启动容器中注册一个 ILog
实例。
对于每个请求,注册一个包装 "root" 实例的新 ILog
实例,以便每个中间件 and/or 每个请求服务都可以使用它。
var containerBuilder = new ContainerBuilder();
containerBuilder.RegisterInstance(log).As<ILog>();
containerBuilder.Register(ctx => {
var rootLog = ctx.Resolve<ILog>();
return new PrependStringLog(rootLog, "request: ");
}).InstancePerRequest();
但是,Autofac 在实例化其构造函数中具有 ILog
的中间件时抱怨循环依赖。
如果我命名 "root log",并使用给定的名称解析,一切都会按预期进行。
containerBuilder.RegisterInstance(log)
.Named("root", typeof(ILog));
containerBuilder.Register(ctx => {
var rootLog = ctx.ResolveNamed<ILog>("root");
return new PrependStringLog(rootLog, "request: ");
}).InstancePerRequest();
我是否被迫使用命名实例来使其工作?
Autofac 在组件请求服务时使用最新注册的服务。
在你的例子中,最新的 ILog
注册是一个 lambda 表达式:
containerBuilder.Register(ctx => {
var rootLog = ctx.Resolve<ILog>();
return new PrependStringLog(rootLog, "request: ");
}).InstancePerRequest();
这个 lambda 表达式请求一个 ILog
,这是 Autofac 试图构建的:这就是它检测循环依赖的原因。
避免循环依赖最简单的方法就是让你的注册不依赖它自己。这就是您通过解析命名 ILog
所做的,这是我推荐的解决方案。
在你的情况下,你也可以直接使用根日志而不解析它:
containerBuilder.RegisterInstance(rootLog).As<ILog>();
containerBuilder.Register(ctx => {
return new PrependStringLog(rootLog, "request: ");
}).InstancePerRequest();
上下文:Owin(自托管)+ WebApi + UseAutofacMiddleware + UseAutofacWebApi
我想做的是:
在应用程序启动容器中注册一个 ILog
实例。
对于每个请求,注册一个包装 "root" 实例的新 ILog
实例,以便每个中间件 and/or 每个请求服务都可以使用它。
var containerBuilder = new ContainerBuilder();
containerBuilder.RegisterInstance(log).As<ILog>();
containerBuilder.Register(ctx => {
var rootLog = ctx.Resolve<ILog>();
return new PrependStringLog(rootLog, "request: ");
}).InstancePerRequest();
但是,Autofac 在实例化其构造函数中具有 ILog
的中间件时抱怨循环依赖。
如果我命名 "root log",并使用给定的名称解析,一切都会按预期进行。
containerBuilder.RegisterInstance(log)
.Named("root", typeof(ILog));
containerBuilder.Register(ctx => {
var rootLog = ctx.ResolveNamed<ILog>("root");
return new PrependStringLog(rootLog, "request: ");
}).InstancePerRequest();
我是否被迫使用命名实例来使其工作?
Autofac 在组件请求服务时使用最新注册的服务。
在你的例子中,最新的 ILog
注册是一个 lambda 表达式:
containerBuilder.Register(ctx => {
var rootLog = ctx.Resolve<ILog>();
return new PrependStringLog(rootLog, "request: ");
}).InstancePerRequest();
这个 lambda 表达式请求一个 ILog
,这是 Autofac 试图构建的:这就是它检测循环依赖的原因。
避免循环依赖最简单的方法就是让你的注册不依赖它自己。这就是您通过解析命名 ILog
所做的,这是我推荐的解决方案。
在你的情况下,你也可以直接使用根日志而不解析它:
containerBuilder.RegisterInstance(rootLog).As<ILog>();
containerBuilder.Register(ctx => {
return new PrependStringLog(rootLog, "request: ");
}).InstancePerRequest();