2011-07-20 18 views
5

Mam atrybut CustomAuthorize, który sprawdza, czy użytkownik ma dostęp do funkcji (użytkownik lub rola może być powiązany z elementami z hierarchicznego zestawu funkcji).Sprawdzanie parametrów atrybutów niestandardowych w czasie projektowania/budowy

Dla danej metody działania ...

[CustomAuthorize("Security.Admin.ManageWidgets.Update")] 

To działa, ale obawiam się, że zmiany w obiekcie bezpieczeństwa może spowodować problemy, które nie zostaną wykryte dopiero okresie czasu. Zdaję sobie sprawę, że mogę pisać testy jednostkowe, aby złagodzić to ryzyko, ale chciałbym wiedzieć, czy możliwe jest sprawdzenie parametru atrybutu podczas kompilacji. Lubię też mieć Intellisense, który pomoże mi wpisać to wyrażenie.

Idealnie, mógłbym podać wyrażenie lambda.

[CustomAuthorize(i => i.Admin.ManageWidgets.Update)] 

Niestety is not currently possible (additional info from Microsoft).

Próbowałem również enkapsulacji ekspresję nadzieję, że będzie oceniana, a następnie przekazywane do atrybutu jako ciąg znaków, ale to również nie udało się skompilować z tym samym błędem (Wyrażenie nie może zawierać anonimowych metod lub wyrażeń lambda).

[CustomAuthorize(LambdaToString(i => i.Admin.ManageWidgets.Update))] 

Jak mogę dodać jakiś czas projektowania/build-czas wsparcie dla mojego zwyczaju parametry atrybutów?

+0

+1 za interesujący problem. – Mrchief

Odpowiedz

1

Można użyć T4 templates do tworzenia niestandardowych klas z właściwościami łańcuchów, kończąc na kodzie podobnym do BennyM, ale generowanym automatycznie.

+0

To mogło ustawić mnie na właściwej ścieżce - mój obiekt zabezpieczeń jest już generowany automatycznie i mogę dodać const do każdej klasy/podklasy, która ma w pełni kwalifikowaną nazwę. Nie jest to dokładnie weryfikacja, czy łańcuch jest w porządku, ale ponieważ jest on generowany automatycznie, mogę bezpiecznie założyć to założenie (i otrzymuję intellisense). – Mayo

3

A Klasa statyczna ze stałymi.

public static class Rights 
{ 
    public const string UpdateWidgets = "UpdateWidgets"; 
} 

obejmują także unittests dla metod, które są ozdobione nimi i będziesz całkiem dobre.

[CustomAuthorize(Rights.UpdateWidgets)] 
1

No nie można sprawdzić tego rodzaju rzeczy w czasie kompilacji - najlepiej można liczyć na to etap post-build, który sprawdza, to za pośrednictwem refleksji.

Można zamiast dostarczać typ i nazwę metody, jak ta:

[CustomAuthorize(typeof(Security.Admin.ManageWidgets), "Update")] 

Ale skoro trzeba jeszcze wpisać nazwę metody jego dyskusyjna jakie korzyści to naprawdę zyskuje ciebie.

Powiązane problemy