Autofac.Integration.WebApi - 创建单例

时间:2015-07-07 07:01:35

标签: asp.net-web-api autofac ioc-container

伙计,

根据我的理解,Autofac.Integration.WebApi有助于在WebAPI项目中创建实例。

我在global.asax中注册了几个类:

    builder.RegisterType<ExecutionContextResolver>().As<IExecutionContextResolver>().InstancePerRequest();
    builder.RegisterType<LoggingService>().As<ILoggingService>().InstancePerRequest();  

这些实例是通过我的控制器构造函数中的构造函数注入自动创建的。我最好的猜测是,这些实例是每个请求的生命周期。到现在为止还挺好。

但是想象一下,我有一个相对&#34;长时间的服务电话。在此调用中,一大堆组件将尝试访问类的相同实例(例如,ConfigurationService)。

有两个选项:

  • 使实例可通过接口访问并随附所有组件
  • 从容器中获取单个实例

我想让我的组件分离,所以我决定使用Autofac容器来获取每个组件中的单例。

但如果我将我的类型注册为

builder.RegisterType<ConfigurationService>().As<IConfigurationService>().SingleInstance();

我会收到以下错误:

  

没有标记匹配的范围&#39; AutofacWebRequest&#39;是可见的   请求实例的范围。这通常表明   正在请求按照HTTP请求注册的组件   一个SingleInstance()组件(或类似的场景。)

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

提前致谢!

1 个答案:

答案 0 :(得分:0)

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