2013-05-24 9 views
2

Я использую 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"); 
    } 
} 
+0

Вы используете Ninject 1, 2 или 3? Если не 3, перейдите на версии NuGet ASAP –

+0

Я использую версию 3 –

ответ

0

Bind ИНГ немного кажется хорошо, предполагая, что он компилирует. (Гадание сейчас .. вам может понадобиться портировать AssemblyScanner бит в Ninject.Extensions.Conventions, но вы не сказали нам ничего об этом.)

Главное, что вы делаете неправильно впрыскивает в private поле. Как вики говорит, в V2 поля не вводятся (довольно уверенные рядовые тоже).

Вы также не указали, где/как используется класс BasePropertyFieldValidator и/или что происходит неправильно.

+0

Спасибо, что нашли время, чтобы посмотреть мой код. Я думаю, что я действительно хотел бы знать это: Как зарегистрировать все валидаторы и как я могу получить Validator для данного типа. Я предполагаю, что это Ioc для начинающих (-: –

+0

@MartinAndersen Ну, «FluentValidatorModule» [при условии, что он поддерживается непосредственно в V3], делает правильную вещь (а если нет, быстрый просмотр в вики wiki должен быть установлен вы на своем пути. Re, как вы его используете, я не знаю - какой код вы пишете - кто использует эти классы? Вы можете подождать, пока кто-то, кто действительно «скучает», посмотрит вашу цитированную библиотеку или вы можете показать небольшими способами, которыми он касается вашего кода и/или контейнера. –