C# Autofac/FluentValidation:没有标记匹配的作用域';AutofacWebRequest';在请求实例的作用域中可见

C# Autofac/FluentValidation:没有标记匹配的作用域';AutofacWebRequest';在请求实例的作用域中可见,c#,dependency-injection,autofac,fluentvalidation,C#,Dependency Injection,Autofac,Fluentvalidation,正在尝试将数据注入FluentValidation验证器: public class MyFormValidator : AbstractValidator<MyForm> { private readonly IQueryable<Models.User> _users; public MyFormValidator(IQueryable<Models.User> users) { _users = users;

正在尝试将数据注入FluentValidation验证器:

public class MyFormValidator : AbstractValidator<MyForm>
{
    private readonly IQueryable<Models.User> _users;

    public MyFormValidator(IQueryable<Models.User> users)
    {
        _users = users;
        ...
    }
}
公共类MyFormValidator:AbstractValidator
{
私人只读可读取用户;
公共MyFormValidator(IQueryable用户)
{
_用户=用户;
...
}
}
我的验证器工厂:

public class DependencyResolverValidatorFactory : ValidatorFactoryBase
{
    private readonly IContainer container;

    public DependencyResolverValidatorFactory(IContainer container)
    {
        this.container = container;
    }

    public override IValidator CreateInstance(Type validatorType)
    {
        return container.ResolveOptionalKeyed<IValidator>(validatorType);
    }
}
公共类依赖项ResolveValidatorFactory:ValidatorFactoryBase
{
专用只读IContainer容器;
公共依存关系ResolveValidatorFactory(IContainer容器)
{
this.container=容器;
}
公共覆盖IValidator CreateInstance(类型validatorType)
{
返回容器。ResolveOptionalKeyed(validatorType);
}
}
我的Autofac配置程序:

public class AutofacConfigurator
{
    public static void Configure()
    {
        var builder = new ContainerBuilder();
        ...

        builder.RegisterType<MyFormValidator>()
            .Keyed<IValidator>(typeof(IValidator<MyForm>))
            .As<IValidator>()
             // 2nd parameter returns IQueryable<User>
            .WithParameter("users", new SqlRepository<User>(dataContext)) 
            .InstancePerRequest();

        builder.RegisterSource(new AnyConcreteTypeNotAlreadyRegisteredSource());

        var container = builder.Build();

        DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

        // Register the validator factory with FluentValidation, and register 
        // FluentValidation as the model validator provider for the MVC framework. 
        // see http://www.jerriepelser.com/blog/using-fluent-validation-with-asp-net-mvc-part-3-adding-dependency-injection
        var fluentValidationModelValidatorProvider = 
            new FluentValidationModelValidatorProvider(
                new DependencyResolverValidatorFactory(container));
        DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
        fluentValidationModelValidatorProvider.AddImplicitRequiredValidator = false;
        ModelValidatorProviders.Providers.Add(fluentValidationModelValidatorProvider);

    }
}
公共类自动传真配置器
{
公共静态void Configure()
{
var builder=new ContainerBuilder();
...
builder.RegisterType()
.键控(类型(IValidator))
.As()
//第二个参数返回IQueryable
.WithParameter(“用户”,新SqlRepository(dataContext))
.InstancePerRequest();
RegisterSource(新的AnyConcreteTypeNotAlreadyRegisteredSource());
var container=builder.Build();
SetResolver(新的AutofacDependencyResolver(容器));
//使用FluentValidation注册验证器工厂,然后注册
//FluentValidation作为MVC框架的模型验证程序提供程序。
//看http://www.jerriepelser.com/blog/using-fluent-validation-with-asp-net-mvc-part-3-adding-dependency-injection
var fluentValidationModelValidatorProvider=
新的FluentValidationModelValidatorProvider(
新的DependencyResolveValidatorFactory(容器));
DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes=false;
fluentValidationModelValidatorProvider.AddImplicitRequiredValidator=false;
ModelValidationProviders.Providers.Add(FluentValidationModelValidationProvider);
}
}
获取以下异常:

从请求实例的作用域中看不到标记与“AutofacWebRequest”匹配的作用域。这通常表示根据HTTP请求注册的组件正被web集成下的SingleInstance()组件(或类似场景)请求。始终从DependencyResolver.Current或ILifetimeScopeProvider.RequestLifetime请求依赖项,而不是从容器本身

我还有其他的验证器,其中大多数都不需要数据注入

这对我来说(在Autofac和FluentValidation方面)是一个很大的新领域,我仍在努力理解我在这里做的事情。我怀疑我只是注册了错误的类型。如何修复此问题并正确注册我的类型


(如果这与已经提出的其他问题太相似,我深表歉意。)

我对FluentValidation没有任何经验,但我怀疑这是您的问题的原因,因此我将继续努力

您得到的异常意味着Autofac无法将您的服务解析为“每个请求的实例”。在Autofac页面上有很多关于这意味着什么的文档。总之,这意味着Autofac将尝试从为发送到Web服务器的每个请求自动创建的生存期范围解析服务。当您将某个内容注册为
.InstancePerRequestScope()
,然后尝试在该范围之外解析该服务时,您将获得所看到的
依赖解析异常

因此,我们确定您的
MyFormValidator
未从“请求”范围中解析。为什么?

您编写的自定义
dependencResolveValidatorFactory
采用Autofac构建的实际
IContainer
,并从中解析。这是一种特殊类型的ILifetimeScope,即“根范围”。没有与此直接关联的请求生存期范围,因此您将获得异常。您需要从从“请求”范围开始的
ILifetimeScope
或包含在请求范围内的子范围进行解析

Autofac/MVC集成已经自动承载了一个请求作用域(在
AutofacDependencyResolver
中,请参见),但您的自定义
DependencyResolveValidatorFactory
没有从中解析。如果您想这样做,我想您可以修改
DependencyResolveValidatorFactory
以接受
AutofacDependencyResolver
实例,并使用该实例进行解析

它看起来像这样:

public class DependencyResolverValidatorFactory : ValidatorFactoryBase
{
    private readonly AutofacDependencyResolver resolver;

    public DependencyResolverValidatorFactory(AutofacDependencyResolver resolver)
    {
        this.resolver = resolver;
    }

    public override IValidator CreateInstance(Type validatorType)
    {
        return resolver.RequestLiftimeScope.ResolveOptionalKeyed<IValidator>(validatorType);
    }
}
假设在创建
IValidator
s的实例时,该工厂确实有一个工作请求,那么应该排除该异常。如果没有,您可能需要使用默认行为(
.InstancePerDependency()
,每次请求时它都会创建一个新实例)或单例(
.SingleInstance()
)进行注册,这取决于/If验证程序可以或应该如何共享


祝你好运。

我在FluentValidation方面没有任何经验,但我怀疑这是你的问题的原因,所以不管怎样,我都会继续努力

您得到的异常意味着Autofac无法将您的服务解析为“每个请求的实例”。在Autofac页面上有很多关于这意味着什么的文档。总之,这意味着Autofac将尝试从为发送到Web服务器的每个请求自动创建的生存期范围解析服务。当您将某个内容注册为
.InstancePerRequestScope()
,然后尝试在该范围之外解析该服务时,您将获得所看到的
依赖解析异常

所以我们
var resolver = new AutofacDependencyResolver(container);
DependencyResolver.SetResolver(resolver);

var fluentValidationModelValidatorProvider = 
    new FluentValidationModelValidatorProvider(
        new DependencyResolverValidatorFactory(resolver));