2012-08-04 8 views
5

Zamierzam napisać składnik sprawdzania poprawności, aby użyć go w różnych projektach. Nie jestem obeznany z żadnymi systemami sprawdzania poprawności, takimi jak Enterprise Library VAB, Fluent, CuttingEdge.Conditions i wieloma innymi, jednak nie mam czasu, aby pracować z nimi wszystkimi, aby zobaczyć, który jest lepszy dla mojego celu.Najlepszy sposób sprawdzania wartości parametrów metody WCF i WebService

Chcę ten składnik w celu zapewnienia 2 różne funkcje dla mnie:

Pierwszy, chcę mieć pewne walidatory jak EmailValidator, StringLengthValidator, MyCustomValidator i tak dalej, że można z nich korzystać kiedy chcę w kod jak poniżej:

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."); 
    ... 
} 

II, muszę zweryfikować parametry stosując coś podobnego DataAnnotations do dowolnego parametru metody, które chcę bez dodatkowego kodowania. Jednym z możliwych sposobów, jaki znam jest pisanie Aspektów przy użyciu PostSharp do wstrzykiwania kodu, w którym rozpoczyna się metoda (OnMethodEntry). Zrobiłem Logging with Postsharp i działa świetnie.

Również Microsoft wprowadza IParameterInspector do Perform Input Validation in WCF, które zapewniają 2 metody BeforCall i AfterCall, ale myślę, że działa tylko dla WCF.

omotać, muszę zrobić sprawdzania poprawności w moim WCF lub WebService tak:

[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) 
    { 
     ... 
    } 
} 

Uwaga: to jest tylko przykładowy kod do wykazania zachowania, które muszę, jakieś inne sugestie to dobrze docenione. Czy dobrze jest, aby adnotacje sprawdzania poprawności * * zostały zmienione na jedną adnotację, taką jak ValidateParam (typeof (EmailValidator))?

góry dzięki

Odpowiedz

3

Tak, chciałbym po prostu spojrzeć na PostSharp do tego. An OnMethodBoundaryAspect lub , który bada parametry metody (dla atrybutów, które mówią, jak sprawdzać poprawność) i argumenty (wartości, które chcesz sprawdzić).

Odtąd wcześniej korzystałeś z OnMethodBoundaryAspect, zapoznaj się z dokumentacją dla MethodExecutionArgs. Możesz uzyskać informacje o metodzie za pomocą args.Method (zwraca wartość MethodBase, która znajduje się w System.Reflection). Zadzwoń pod numer GetParameters(), który zwraca tablicę z ParameterInfo. Na każdym obiekcie ParameterInfo można uzyskać informacje o atrybutach za pomocą właściwości Attributes.

Gdy znasz już te atrybuty, wiesz, z których metod walidacji należy korzystać (lub jeśli tworzysz własne atrybuty, metoda sprawdzania poprawności może znajdować się w samych klasach atrybutów). Następnie wystarczy użyć wartości args.Arguments, aby uzyskać wartości argumentów.

Oto niektóre z nich (psuedo) Kod:

To nie jest prawdziwy kod: szczegóły będziesz musiał pracować samemu.

Podoba mi się pomysł umieszczenia kodu walidacyjnego w samych atrybutach, ponieważ nie trzeba będzie zmieniać aspektu w celu dodania dodatkowych typów sprawdzania poprawności.

+1

Dokładnie to miałem na myśli i prawie skończyłem kodowanie. Znalazłem ten [post] (http://badecho.com/2011/11/validating-method-parameters-with-postsharp) autorstwa Matta Webera, który był pomocny (pierwsza część). Wprowadzając kod sprawdzania poprawności w atrybutach, dodałem metodę interfejsu 'GetValidator', więc każdy atrybut zwraca odpowiedni weryfikator. Problem, przed którym stoję, dotyczy generycznych sprawdzania poprawności, takich jak 'RangeValidator', ponieważ C# nie obsługuje ogólnych atrybutów, muszę napisać przeciążenie konstruktora dla każdego typu, takiego jak int, double, datetime ... – Ashkan

+1

dzięki przy okazji! Twoja odpowiedź sprawiła, że ​​poczułem się lepiej w związku z tym podejściem. Również piszę moje walidatory za pomocą FluentValidation. Myślę, że to całkiem nieźle. – Ashkan

Powiązane problemy