#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
интерфейса?