Я использую fody.validar, и он работает очень хорошо, но я бы хотел использовать Ninject как ValidationFactory вместо домашнего. Потому что мне нужно внедрить некоторые службы для проверки объектов вне контекста проверяемого объекта.Что такое синтаксис Ninject для регистрации и получения FluentValidations IValidator
Может кто-то поможет мне переписать так:
public static class ValidationFactory
{
static readonly Dictionary<RuntimeTypeHandle, IValidator> Validators = new Dictionary<RuntimeTypeHandle, IValidator>();
public static IValidator GetValidator(Type modelType)
{
IValidator validator;
if (!Validators.TryGetValue(modelType.TypeHandle, out validator))
{
var typeName = modelType.Name + "Validator";
var type = Type.GetType("Nexcom.KnownTypes.PropertyFields.Validation." + typeName, true);
validator = (IValidator)Activator.CreateInstance(type);
Debug.Assert(validator != null);
Validators.Add(modelType.TypeHandle, validator);
}
return validator;
}
}
Чтобы использовать Ninject вместо этого?
Я нашел этот код
public class FluentValidatorModule : NinjectModule
{
public override void Load()
{
AssemblyScanner
.FindValidatorsInAssemblyContaining<TextBoxValidator>()
.ForEach(match => Bind(match.InterfaceType).To(match.ValidatorType));
}
}
и подключили его так:
var kernel = new StandardKernel(new FluentValidatorModule());
Но я не знаю, как связать все это вместе.
Вот один из валидаторов, я хочу, чтобы привязать к PropertyField:
public class BasePropertyFieldValidator<T> : AbstractValidator<T> where T: IPropertyField
{
[Inject] private IUniquePropertyName _uniqueProperty;
public BasePropertyFieldValidator()
{
RuleFor(c => c.Name)
.Cascade(CascadeMode.StopOnFirstFailure)
.NotEmpty()
.WithMessage("Please specify a name")
.Matches(UniquePropertyName.ValidNameRegex)
.WithMessage("Name can only contain: a-z, A-Z, 0-9, _")
.Must(_uniqueProperty.NameIsUnique)
.WithMessage("Please enter a unique name");
}
}
Вы используете Ninject 1, 2 или 3? Если не 3, перейдите на версии NuGet ASAP –
Я использую версию 3 –