我正在使用ASP.NET vNext,我希望在我的某些注册中使用InstancePerRequest
,例如MyDbContext
就是一个例子。
我已Autofac
使用InstancePerLifetimeScope
运行这些依赖项。哪个有用......
但是一旦我转换到使用InstancePerRequest
,我就会遇到这个常见错误:
DependencyResolutionException:没有标记匹配的范围 ' AutofacWebRequest'从实例的范围可见 被要求了。这通常表示注册为的组件 SingleInstance()组件正在请求每HTTP请求 (或类似场景。)在Web集成下始终请求 来自DependencyResolver.Current或的依赖项 ILifetimeScopeProvider.RequestLifetime,永远不会从容器中 本身。
我已经阅读过Autofac帮助文档....但我不确定如何设置"请求生命周期范围"这导致了这个例外。
有没有人设置一个集成Autofac的ASP.NET 5网络应用,包括InstancePerRequest
?
答案 0 :(得分:8)
据我所知,您有两个选项,它们都会根据请求为您提供实例。
假设您有以下课程注册:
public class Foo : IDisposable
{
public Foo()
{
Console.WriteLine("created");
}
public void Dispose()
{
Console.WriteLine("disposed");
}
}
您可以在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构建器上将该类型注册为每个生命周期范围的实例,这将为您提供每个请求生命周期的实例:
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