DataAnnotations y FluentValidation que no trabaja en el proyecto MVC 2
-
27-09-2019 - |
Pregunta
He editado la pregunta original ya que el mismo error está ocurriendo con la diferencia de la puesta en práctica, ahora se han añadido a la mezcla de Ninject.
He creado una clase para las reglas de validación
public class AlbumValidator : AbstractValidator<Album> {
public AlbumValidator() {
RuleFor(a => a.Title).NotEmpty();
}
}
He creado una ValidatorModule para Ninject
internal class FluentValidatorModule : NinjectModule {
public override void Load() {
AssemblyScanner.FindValidatorsInAssemblyContaining<AlbumValidator>()
.ForEach(result => Bind(result.InterfaceType).To(result.ValidatorType).InSingletonScope());
}
}
Aquí está mi ValidatorFactory
public class NinjectValidatorFactory : ValidatorFactoryBase {
public override IValidator CreateInstance(Type validatorType) {
if (validatorType.GetGenericArguments()[0].Namespace.Contains("DynamicProxies")) {
validatorType = Type.GetType(string.Format("{0}.{1}[[{2}]], {3}",
validatorType.Namespace,
validatorType.Name,
validatorType.GetGenericArguments()[0].BaseType.AssemblyQualifiedName,
validatorType.Assembly.FullName));
}
return Container.Get(validatorType) as IValidator;
}
IKernel Container { get; set; }
public NinjectValidatorFactory(IKernel container) {
Container = container;
}
}
y las partes pertinentes de mi Global
protected override void OnApplicationStarted() {
AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
var factory = new NinjectValidatorFactory(Container);
ModelValidatorProviders.Providers.Add(
new FluentValidationModelValidatorProvider(factory));
DataAnnotationsModelValidatorProvider
.AddImplicitRequiredAttributeForValueTypes = false;
}
protected override IKernel CreateKernel() {
return Container;
}
IKernel Container {
get { return new StandardKernel(new FluentValidatorModule()); }
}
Me carga el sitio de ejemplo, haga clic en el enlace crear nuevo álbum y luego haga clic en el botón Crear dejando el título vacía, entonces me da la bienvenida con el error de anulación protected void OnApplicationStarted () { AreaRegistration.RegisterAllAreas (); RegisterRoutes (RouteTable.Routes);
var factory = new NinjectValidatorFactory(Container);
ModelValidatorProviders.Providers.Add(
new FluentValidationModelValidatorProvider(factory));
DataAnnotationsModelValidatorProvider
.AddImplicitRequiredAttributeForValueTypes = false;
}
protected override IKernel CreateKernel() {
return Container;
}
IKernel Container {
get { return new StandardKernel(
new Bootstrapper(),
new FluentValidatorModule()); }
}
Me carga el formulario crear y haga clic en Crear dejando el título bajo vacío y he aquí un error
This property cannot be set to a null value.
La línea que hace referencia está dentro de la auto clase Entity Framework generado, Rastreé la
Namespace.Contains("DynamicProxies")
y se vuelve falsa, es porque me dijeron EF utilizar un espacio de nombres personalizado SampleMusicStore.Web?
O me estoy perdiendo algo más?
Saludos.
Solución
El problema es que Entity Framework es la generación de proxies dinámicos en sus clases, y luego el sistema está tratando de validar contra las clases de proxy en lugar de las clases que ha definido.
La manera de resolver esto es lo mismo que esto respuesta .