Frage

Ich erhalte einen ‚nicht registrierten Fehler‘ während der Ausführung in dem ValidatorFactory.CreateInstance Anruf. Es scheint, die Art gesendet in das Verfahren korrekt ist.

Mein Registrierungscode:

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

Meine ValidatorFactory Code:

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

Meine Ansicht Modell und Validierungscode:

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

Meine beste Vermutung ist, dass ich die Validierer falsch bin Registrierung.

War es hilfreich?

Lösung 3

Aktuelle Registrierungscode:

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

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

Aktuelle ValidatorFactory:

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

Die gleiche Fehler innerhalb CreateInstance:

Der angeforderte Dienst 'FluentValidation.IValidator`1 [.EmployeeViewModel] (FluentValidation.IValidator)' nicht registriert worden ist.

Andere Tipps

zu lösen aus mehreren Klassen, die IValidator, die Autofac Dokumentation zeigt eine Implementierung paar Techniken. Ich glaube nicht, können Sie Montage mit diesen Methoden Scannen verwenden; Sie werden die Validierer individuell haben registrieren.

Nach Namen

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

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

Mit der Taste

Die Dokumentation zeigt eine Aufzählung als Schlüssel verwendet werden, aber der Typ als Schlüssel verwenden können, die Sie mit der Resolve validatorType nennen würde lassen Sie wird in der CreateInstance Methode übergeben.

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

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

Hinweis: Die Dokumentation ist für Version 2.3 von Autofac. Ich bin mit 2.2.4, weshalb die Methodennamen oben aus der Dokumentation abweichen.

Hope, das hilft.

Die andere Antwort von @adrift ist ein schöner, sauberer Ansatz. Nur ein paar Notizen hinzuzufügen, dies funktioniert auch mit dem IIndex<K,V> Beziehungstyp, die Autofac automatisch bereitstellt, z.

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

Hinweis : Verwenden Sie nicht IContainerProvider und ApplicationContainer in einer bauteil statt Verwendung IComponentContext oder IIndex<K,V> wie oben. Dies verhindert Lebensdauer Fragen (Ihr Beispiel Mitarbeiter Validierer mit der Anwendung statt der Anfrage Lebensdauer.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top