在“Singleton”中解析 InstancePerHttpRequest

本文关键字:InstancePerHttpRequest Singleton | 更新日期: 2023-09-27 18:33:32

我正在尝试在现有的MVC4应用程序中开始使用依赖注入。我已经安装了Autofac 3.1.1和Autofac MVC4集成3.1.0。到目前为止,我对此感到非常满意 - 但是,我在请求确定一次性服务范围时遇到了困难:

namespace App_Start
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    using Autofac;
    using Autofac.Integration.Mvc;
    public static class KernelConfig
    {
        private static IContainer Container { get; set; }
        public static void Register()
        {
            var builder = new ContainerBuilder();
            builder.RegisterControllers(typeof(MvcApplication).Assembly);
            builder.RegisterType<Bar>()
                   .As<IBar>()
                   .InstancePerHttpRequest();
            builder.RegisterType<Foo>()
                   .As<Foo>()
                   .SingleInstance();
            Container = builder.Build();
            DependencyResolver.SetResolver(new AutofacDependencyResolver(Container));
        }

        class Foo
        {
            private readonly IBar _bar;
            public Foo(IBar bar)
            {
                _bar = bar;
            }
        }
        interface IBar
        {
            void DoStuff();
        }
        class Bar : IBar, IDisposable
        {
            public void DoStuff() { }
            public void Dispose() { }
        }
    }
}

如果我在控制器构造函数中请求 IBar 的实例,一切都按预期工作 - 每次都会创建一个新柱线,每次都会销毁。但是,如果我在我的控制器构造函数中请求 Foo,我会收到以下消息:

"从 请求实例的范围">

据我所知,Autofac正在创建一个新的Foo作为单例。虽然这看起来很明显(我要求它是一个单例(,但我希望 Autofac 遍历依赖树并在整个树中使用相同的生存期。(即,如果单例包含瞬态,则两者都应该是瞬态的(

这是预期的行为吗?我做错了什么?

在“Singleton”中解析 InstancePerHttpRequest

你可以使用对 IBarFactory 的依赖而不是 IBarIBarFactory 将具有 sigleton 生活方式,它将返回 IBar 实例,该实例将从容器解析。

引发异常是因为代码正在尝试解析单个实例对象中的 InstancePerHttpRequest 对象。

通过一些修改,您可以实现这一点。

  1. 转换 Foo 以接受 Func
公共类 Foo {    私有只读函数_barFunc;    public Foo(Func barFunc( {        _barFunc = barFunc;    }}
  1. 使用 DependencyResolver.Current 对象解析 Func
建筑工人。Register(c => new Foo((( => DependencyResolver.Current.GetService((((   .As((   .SingleInstance((;

有关Autofac示波器的更多提示,请查看此链接每个请求范围的 Autofac

相关文章:
  • 没有找到相关文章