Autofac / FluentValidation:没有标记匹配的范围' AutofacWebRequest'从请求实例的范围中可见

时间:2015-12-08 00:02:58

标签: 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;
        ...
    }
}

我的验证工厂:

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

我的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);

    }
}

获得以下例外:

  

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

我有其他验证器,其中大部分都不需要注入数据。

这对我来说是很大的新理由(在Autofac和FluentValidation中),我仍在努力了解我在这里做的事情。我怀疑我只是错误地注册了我的类型。我如何解决此问题并正确注册我的类型?

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

0 个答案:

没有答案