Asp.net web api Autofac.Integration.WebApi-创建单例

Asp.net web api Autofac.Integration.WebApi-创建单例,asp.net-web-api,autofac,ioc-container,Asp.net Web Api,Autofac,Ioc Container,各位 据我所知,Autofac.Integration.WebApi有助于在WebApi项目中创建实例 我在我的global.asax中注册了几个课程: builder.RegisterType<ExecutionContextResolver>().As<IExecutionContextResolver>().InstancePerRequest(); builder.RegisterType<LoggingService>().As<

各位

据我所知,Autofac.Integration.WebApi有助于在WebApi项目中创建实例

我在我的global.asax中注册了几个课程:

    builder.RegisterType<ExecutionContextResolver>().As<IExecutionContextResolver>().InstancePerRequest();
    builder.RegisterType<LoggingService>().As<ILoggingService>().InstancePerRequest();  
builder.RegisterType().As().InstancePerRequest();
builder.RegisterType().As().InstancePerRequest();
这些实例是通过我的控制器构造函数中的构造函数注入自动创建的。我最好的猜测是,这些实例是每个请求生命周期的。到目前为止,一切顺利

但是想象一下,我有一个“相对”长时间运行的服务呼叫。在这个调用中,许多组件将尝试访问类的相同实例(例如ConfigurationService)

有两种选择:

  • 通过接口使实例可访问,并随身携带所有组件
  • 从容器中获取单个实例
我想让我的组件保持解耦,所以我决定使用Autofac容器在每个组件中获得一个单例

但是如果我把我的类型注册为

builder.RegisterType<ConfigurationService>().As<IConfigurationService>().SingleInstance();
builder.RegisterType().As().SingleInstance();
我将得到以下错误:

从中看不到标记与“AutofacWebRequest”匹配的作用域 请求实例的范围。这通常表明 正在请求按照HTTP请求注册的组件 SingleInstance()组件(或类似场景。)

有没有办法在Autofac.Integration.WebApi中处理单例


提前谢谢

如错误消息所示,您的ConfigurationService singleton具有一些依赖项,这些依赖项在“每个请求”生存期范围内注册。这打破了依赖关系树,因为当没有可用的请求范围时,您的单例组件被实例化,更糟糕的是,如果您有机会让它工作(在单例第一次实例化时,将有一个可用的请求范围),在请求完成后,所有“每个请求”组件将被处置,您的单例将在使用这些组件时崩溃。

您能否共享
ConfigurationService
ctor?它是否依赖于依赖于每个HTTP请求的服务?它实际上是这样的。它依赖于作为每个请求上下文的服务。你认为这就是问题所在吗?当Autofac创建singleton时,它将没有任何可用的per http作用域。这就是为什么你会有这样的错误信息“你认为这就是问题所在吗?”-如果你真的读了,这正是错误信息告诉你的。谢谢Alexey。这一切对我来说都是有意义的,并且对理解系统的行为有很大帮助!请告诉我,因为我对Autofac和web请求比较陌生。如果有一点经验,错误消息可能会对我更有帮助。