Voy a escribir un componente de validación para usarlo en diferentes proyectos. No estoy familiarizado con ninguno de los marcos de validación como Enterprise Library VAB, Fluent, CuttingEdge.Conditions y muchos otros, sin embargo, no tengo tiempo para trabajar con todos ellos para ver cuál es mejor para mi propósito.La mejor forma de validar los valores de los parámetros del método WCF y WebService
Quiero este componente para proporcionar 2 funcionalidades diferentes para mí:
Primera, quiero tener algunos validadores como EmailValidator, StringLengthValidator, MyCustomValidator y así sucesivamente, que puedo usarlos cuando quiera en el código, como a continuación:
public class EmailValidator : RegexValidator // or StringValidator or whatever!
{
public EmailValidator() : base("emailRegexHere")
{
}
public bool override DoValidate(string value)
{
return base.DoValidate(value);
}
}
...
public void MyMethod(string email)
{
EmailValidator validator = new EmailValidator();
if(!validator.Validate(email))
throw new NotValidatedException("email is invalid.");
...
}
Segunda, necesito para validar los parámetros mediante la aplicación de algo así como DataAnnotations a cualquier parámetro del método que yo quiero sin ningún tipo de codificación adicional. Una posible forma que conozco es escribiendo Aspectos usando PostSharp para inyectar el código donde se inicia el método (OnMethodEntry). He hecho Logging con Postsharp y funciona muy bien.
También Microsoft introduce IParameterInspector en Perform Input Validation in WCF que proporcionan 2 métodos BeforCall y AfterCall, pero creo que solo funciona para WCF.
Para terminar, tengo que hacer la validación en mi WCF o servicio Web como esto:
[System.Web.Script.Services.ScriptService]
public class MyServiceClass : System.Web.Services.WebService
{
[Aspects.Validate]
[WebMethod(EnableSession = true)]
public string SubmitComment([Validation.Required]string content,[Validation.Guid] string userId,[Validation.Required] [Validation.Name]string name, [Validation.Email]string email, string ipAddress)
{
...
}
}
Nota: esto es sólo un código de ejemplo para demostrar el comportamiento que necesito, alguna otra sugerencia es Bien apreciado. ¿También es una buena idea que las anotaciones de Validación * se cambien a una anotación como ValidateParam (typeof (EmailValidator))?
Gracias de antemano
Eso es exactamente lo que tenía en mente, y casi termino de codificar. Encontré esta [publicación] (http://badecho.com/2011/11/validating-method-parameters-with-postsharp) de Matt Weber que fue útil (la primera parte). Acerca de poner el código de validación en los atributos, agregué un método de interfaz 'GetValidator', por lo que cada atributo devuelve su validador apropiado. El problema que estoy enfrentando es para validadores genéricos como 'RangeValidator', ya que C# no admite atributos genéricos, tengo que escribir una sobrecarga de constructor para cada tipo como int, double, datetime ... – Ashkan
gracias por cierto! su respuesta me hizo sentir mejor acerca de este enfoque. También estoy escribiendo mis validadores con FluentValidation. Creo que es bastante bueno. – Ashkan