0

在 ValidatorFactory.CreateInstance 调用中执行期间出现“未注册错误”。看起来发送到方法中的类型是正确的。

我的注册码:

...
builder.RegisterAssemblyTypes(assembly).Where(t => t.Name.EndsWith("Validator")).As<IValidator>();
builder.Register(d => _containerProvider).As<IContainerProvider>();
builder.Register(d => new ValidatorFactory(_containerProvider.ApplicationContainer.Resolve<IContainerProvider>())).As<IValidatorFactory>();

_containerProvider = new ContainerProvider(builder.Build());

我的 ValidatorFactory 代码:

public class ValidatorFactory : ValidatorFactoryBase {
    private readonly IContainerProvider _containerProvider;

    public ValidatorFactory(IContainerProvider containerProvider) {
        _containerProvider = containerProvider;
    }

    public override IValidator CreateInstance(Type validatorType) {
        return _containerProvider.ApplicationContainer.Resolve<IValidator>(validatorType);
    }
}

我的视图模型和验证器代码:

[Validator(typeof(EmployeeViewModelValidator))]
public class EmployeeViewModel {
    public EmployeeViewModel() {}
    public EmployeeViewModel(string firstName) {
        FirstName = firstName;
    }

    public string FirstName { get; private set; }
}

public class EmployeeViewModelValidator : AbstractValidator<EmployeeViewModel> {
    public EmployeeViewModelValidator() {
        RuleFor(x => x.FirstName)
            .NotEmpty();
    }
}

我最好的猜测是我错误地注册了验证器。

4

3 回答 3

1

为了从实现的多个类中解析IValidatorautofac 文档显示了几种技术。我不认为您可以使用这些方法使用程序集扫描;您将单独注册验证器。

按名字

builder.RegisterType<EmployeeViewModelValidator>().Named<IValidator>("employee");

var r = container.Resolve<IValidator>("employee");

按键

文档显示了一个枚举被用作键,但您可以使用类型作为键,这将允许您Resolve使用在方法validatorType中传递给您的进行调用CreateInstance

builder.RegisterType<EmployeeViewModelValidator>().Keyed<IValidator>(typeof(EmployeeViewModelValidator));    

var r = container.Resolve<IValidator>(validatorType);

注意:该文档适用于 Autofac 2.3 版。我使用的是 2.2.4,这就是为什么上面的方法名称与文档不同的原因。

希望这可以帮助。

于 2010-10-13T04:36:28.623 回答
1

@adrift 的另一个答案是一个很好的干净方法。只是添加一些注释,这也适用于IIndex<K,V>Autofac 自动提供的关系类型,例如:

public class ValidatorFactory : ValidatorFactoryBase {
    readonly IIndex<Type, IValidator> _validators;

    public ValidatorFactory(IIndex<Type, IValidator> validators) {
        _validators = validators;
    }

    public override IValidator CreateInstance(Type validatorType) {
        return _validators[validatorType];
    }
}

重要说明:不要在组件中使用IContainerProviderand ,而是使用or如上所述。这将有助于防止生命周期问题(您的示例将验证器与应用程序关联,而不是请求生命周期。)ApplicationContainerIComponentContextIIndex<K,V>

于 2010-10-13T21:57:20.283 回答
0

当前注册码:

builder.RegisterType<EmployeeViewModelValidator>().Keyed<IValidator>(typeof(EmployeeViewModel));
builder.RegisterType<ValidatorFactory>().As<IValidatorFactory>();

_containerProvider = new ContainerProvider(builder.Build());

当前验证器工厂:

public class ValidatorFactory : ValidatorFactoryBase {
    readonly IIndex<Type, IValidator> _validators; 

    public ValidatorFactory(IIndex<Type, IValidator> validators) {
        _validators = validators;
    } 

    public override IValidator CreateInstance(Type validatorType) {
        return _validators[validatorType];
    }
}

CreateInstance 中的相同错误:

请求的服务 'FluentValidation.IValidator`1[.EmployeeViewModel] (FluentValidation.IValidator)' 尚未注册。

于 2010-10-14T00:55:13.783 回答