【问题标题】:ASP.NET 5 (VNext) Autofac Instance per Request每个请求的 ASP.NET 5 (VNext) Autofac 实例
【发布时间】:2015-04-11 20:27:00
【问题描述】:

我正在使用 ASP.NET vNext,我想使用 InstancePerRequest 进行一些注册,例如 MyDbContext 就是一个例子。

我有 Autofac 使用 InstancePerLifetimeScope 运行这些依赖项。哪个有效....

但一旦我改用InstancePerRequest,我就会收到这个常见错误:

DependencyResolutionException:没有标签匹配的范围 'AutofacWebRequest' 在实例所在的范围内可见 被要求。这通常表明一个组件注册为 SingleInstance() 组件正在请求每个 HTTP 请求 (或类似的场景。)在 web 集成下总是请求 DependencyResolver.Current 或 ILifetimeScopeProvider.RequestLifetime,从不来自容器 自己。

我已阅读有关此问题的 Autofac 帮助文档....但我不确定如何设置导致此异常的“请求生命周期范围”。

有没有人设置了一个集成 Autofac 的 ASP.NET 5 Web 应用程序,包括InstancePerRequest

【问题讨论】:

  • 我还没有尝试使用 Autofac 的 ASP.net v5,但是这个错误的一个常见原因是 HttpContext.Current 在解析时为空。异常的堆栈跟踪是什么?你在解析 HTTP 请求之外的类型吗?
  • 是的,在运行时它试图解决每个请求对标记的生命周期范围的依赖关系,这是每个请求最重要的。问题是尚未设置生命周期范围。我会尽快贴出堆栈跟踪。

标签: asp.net autofac asp.net-core asp.net-core-mvc


【解决方案1】:

据我所知,您有两种选择,它们都会根据请求为您提供实例。

假设您要注册以下课程:

public class Foo : IDisposable 
{
    public Foo()
    {
        Console.WriteLine("created");
    }

    public void Dispose()
    {
        Console.WriteLine("disposed");
    }
}

向 IServiceCollection 注册

您可以将实例注册为IServiceCollection 的作用域,并基于此构建 Autofac 容器。

        public IServiceProvider ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();
            services.AddScoped<Foo, Foo>();

#if DNX451
            // Create the autofac container
            var builder = new ContainerBuilder();

            // Create the container and use the default application services as a fallback
            AutofacRegistration.Populate(builder, services);
            var container = builder.Build();

            return container.Resolve<IServiceProvider>();
#endif

            return services.BuildServiceProvider();
        }

在 Autofac Builder 上注册

您可以在 Autofac builder 上将类型注册为每个生命周期范围的实例,这将为您提供每个请求生命周期的实例:

        public IServiceProvider ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();
#if DNX451

            // Create the autofac container
            var builder = new ContainerBuilder();

            // Create the container and use the default application services as a fallback
            AutofacRegistration.Populate(builder, services);
            builder.RegisterType<Foo>().As<Foo>().InstancePerLifetimeScope();
            var container = builder.Build();

            return container.Resolve<IServiceProvider>();
#endif

            return services.BuildServiceProvider();
        }

如前所述,两者的结果相同:

有关 ASP.NET 5 上每个请求实例的更多信息:Middlewares and Per Request Dependency Injection

【讨论】:

  • Cheers @tugberk.. 我认为有一种方法可以显式使用 InstancePerRequest... 但如果以这种方式使用 'InstancePerLifetimeScope' 是一样的,那就太好了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多