每个请求的ASP.NET 5(VNext)Autofac实例

时间:2015-04-11 20:27:00

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

我正在使用ASP.NET vNext,我希望在我的某些注册中使用InstancePerRequest,例如MyDbContext就是一个例子。

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

但是一旦我转换到使用InstancePerRequest,我就会遇到这个常见错误:

  

DependencyResolutionException:没有标记匹配的范围   ' AutofacWebRequest'从实例的范围可见   被要求了。这通常表示注册为的组件   SingleInstance()组件正在请求每HTTP请求   (或类似场景。)在Web集成下始终请求   来自DependencyResolver.Current或的依赖项   ILifetimeScopeProvider.RequestLifetime,永远不会从容器中   本身。

我已经阅读过Autofac帮助文档....但我不确定如何设置"请求生命周期范围"这导致了这个例外。

有没有人设置一个集成Autofac的ASP.NET 5网络应用,包括InstancePerRequest

1 个答案:

答案 0 :(得分:8)

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

假设您有以下课程注册:

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构建器上将该类型注册为每个生命周期范围的实例,这将为您提供每个请求生命周期的实例:

        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();
        }

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

enter image description here

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