Mój walidator

0

Witam, szukałem w internecie odpowiedzi na mój temat, jednakże w dalszym ciągu jej nie znalazłem, co za tym idzie, postanowiłem poszukać tutaj pomocy :)

Aktualnie jestem w trakcie pisania aplikacji desktopowej (Windows Forms), informacje z bazą wymieniam za pomocą ADO.NET.

Do każdej tabeli w bazie mam jej odpowiednik w postaci klasy, co za tym idzie wypełnioną klasę przekazuję do modelu, a on się zajmuje resztą -- logiczne.

Dotychczas walidację wykonuję na zasadzie statycznej klasy, która posiada takie metody jak StringLength, MailValid itd, które sprawdzają czy dany string / int itd pasuje do wzorca i zwracają bool. Przed wysłaniem klasy do modelu muszę sprawdzić tego boola, i jeśli wszystkie true, to wysyłamy dane do modelu.

W ASP.NET MVC, walidację zrobili w bardzo przyjemny sposób - na zasadzie atrybutów. Zastanawiałem się troszkę, jak to tam jest zrobione i jak to zaplanować / zaprojektować, aby wszystko działało w brzydko brzmiącej "kupie". W sumie nie pisałem jeszcze z użyciem atrybutów i wiem, że aby to wszystko działało będzie pewnie znacznie, znacznie, znacznie więcej pracy niż użycie statycznej klasy ;)

Jedyne co mi przyszło na myśl, to stworzyć klasę atrybutu (główną) np.

 
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct, AllowMultiple = false, Inherited = false)]
    public sealed class ValidationAttribute : System.Attribute
    {
        public ValidationAttribute()
        {
            IsValid = true;
        }

        public bool IsValid { get; set; }
    }

a następnie klasy dla pól i propert np.

    [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple=false, Inherited=false)]
    public sealed class StringLengthAttribute : System.Attribute
    {
        public StringLengthAttribute(int maxLength)
        {
            this.Length = maxLength;
        }

        public int Length { get; private set; }
    }

Tak jak wyżej wspomniałem , zastanawiam się co dalej, poczytałem o reflekcji, którą trzeba tutaj na pewno użyć, ale napotkałem się na sporą ilość braków w wiedzy.

Począwszy od prostych problemów, gdzie przeprowadzić walidacje, w konstruktorze ValidationAttribute ?

Jak ją przeprowadzić, w jakieś metodzie ? pobierać wszystkie pola z danej klasy, sprawdzać jakie mają typy atrybutów, sprawdzać jakie atrybuty mają wartości a następnie dopiero porównywać wartości z atrybutów do wartości ze zmiennych.

Co prawda klasa z atrybutami będzie jedna, ale obiektów tej klasy może być wiele. Ja jedynie przez refleksje dobierałem się do danych klasy, zaś nigdy do obiektów (o tym też szukałem...). Czy jest możliwość pobrania listy wszystkich obiektów, które posiadają atrybut validation ?

Wiem, że z punktu widzenia, to szkoda czasu na zabawę z czymś takim. Pytam tutaj bardziej z ciekawości, jak "oni (ms)" to rozwiązał.

0

To może przejrzyj sobie kod od Fluent Validation na Codeplexie?

1 użytkowników online, w tym zalogowanych: 0, gości: 1