Fluentvalidation вводит бизнес-объект в валидатор

#asp.net-mvc-3 #structuremap #fluentvalidation #fluentvalidation-2.0

#asp.net-mvc-3 #structuremap #fluentvalidation #fluentvalidation-2.0

Вопрос:

Я использую fluentvalidation и использую structuremap для ввода валидаторов для действий в asp.net mvc3. У меня проблемы с внедрением моих бизнес-объектов в объекты валидатора. Я получаю такую ошибку:

{«Код исключения StructureMap: 202n Экземпляр по умолчанию не определен для PluginFamily Suggestion.Biz.BO.ISubjectBO, предложение.Biz, Version = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null «}

Как я могу ввести SubjectBO в SubjectValidator?

SubjectValidator:

 public class SubjectValidator : AbstractValidator<SUBJECT>
{
    private ISubjectBO _subjectBO;
    public SubjectValidator(ISubjectBO subjectBO)
    {
        _subjectBO = subjectBO;
        Custom(x=>{
            if(!_subjectBO.CanUpdate(x))
            return new ValidationFailure(null, "error msg");
            return null;
        });
    }
}
  

SuggestionValidationRegistry:

 public class SuggestionValidationRegistry : Registry
{
    public SuggestionValidationRegistry()
    {

        For<IValidator<SUBJECT>>().Singleton().Use<SubjectValidator>();
        ValidatorOptions.ResourceProviderType = typeof(ValidationResources);
    }
}
  

StructureMapValidatorFactory:

 public class StructureMapValidatorFactory : ValidatorFactoryBase
{
    public override IValidator CreateInstance(Type validatorType)
    {

        return ObjectFactory.TryGetInstance(validatorType) as IValidator;
    }
}
  

App_start:

         ObjectFactory.Configure(cfg => cfg.AddRegistry(new SuggestionValidationRegistry()));
        FluentValidationModelValidatorProvider.Configure(provider => provider.ValidatorFactory = new StructureMapValidatorFactory());
        DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
  

Да, я настраиваю при app_start
SuggestionBizRegistry :

 public class BizRegistry : Registry
{
    public BizRegistry()
    {
        For<IAwardTypeBO>().Use<AwardTypeBO>();
        For<IQuoteBO>().Use<QuoteBO>();
        For<ISubjectBO>().Use<SubjectBO>();
        For<IContestBO>().Use<ContestBO>();
        For<IApplicationBO>().Use<ApplicationBO>();
        For<IScreenBO>().Use<ScreenBO>();
    }
}
  

App_start:

 protected void Application_Start()
    {
        ConfigureStructureMap();

        AreaRegistration.RegisterAllAreas();

        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);

        EFUnitOfWorkFactory.SetObjectContext(() => new SuggestionModel());


        UnitOfWork.UnitOfWorkFactory = new EFUnitOfWorkFactory();


    }

    private static void ConfigureStructureMap()
    {
        IContainer container = new Container(x =>
        {
            x.For<IControllerActivator>().Use<StructureMapControllerActivator>();
            x.AddRegistry(new BizRegistry());                
        });
        DependencyResolver.SetResolver(new StructureMapDependencyResolver(container));
        ObjectFactory.Configure(cfg => cfg.AddRegistry(new SuggestionValidationRegistry()));
        FluentValidationModelValidatorProvider.Configure(provider => provider.ValidatorFactory = new StructureMapValidatorFactory(container));
        DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
    }
  

Ответ №1:

Вы не настроили параметр конструктора ISubjectBO subjectBO при настройке SubjectValidator внедрения

Ответ №2:

Вы могли бы написать собственную фабрику валидаторов, как описано в этой теме .

Комментарии:

1. У меня есть фабрика валидаторов StructureMapValidatorFactory(): открытый класс StructureMapValidatorFactory : ValidatorFactoryBase { публичное переопределение IValidator CreateInstance(Тип validatorType) { возвращает ObjectFactory. TryGetInstance(validatorType) как IValidator; } }

2. @Yorgo, вы настроили экземпляр для ISubjectBO интерфейса?