Fluentvalidation 将业务对象注入验证器
我正在使用 fluidvalidation 并使用 Structuremap 为 asp.net mvc3 中的操作注入验证器。我在将业务对象注入验证器对象时遇到问题。我收到这样的错误:
{“StructureMap 异常代码:202\n没有为 PluginFamily Suggestion.Biz.BO.ISubjectBO、Suggestion.Biz、Version=1.0.0.0、Culture=neutral、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>();
}
}
应用程序_启动:
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;
}
I am using fluentvalidation and use structuremap to inject validators for actions in asp.net mvc3. I have problems to inject my business objects to validator objects. I get an error like this:
{"StructureMap Exception Code: 202\nNo Default Instance defined for PluginFamily Suggestion.Biz.BO.ISubjectBO, Suggestion.Biz, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"}
How can i inject SubjectBO to 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;
Yes i configure at 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;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
配置
SubjectValidator
注入时,您未配置构造函数参数ISubjectBO subjectBO
You have not configured constructor parameter
ISubjectBO subjectBO
when configuringSubjectValidator
injection您可以按照此线程中的说明编写自定义验证器工厂。
You could write a custom validator factory as explained in this thread.