Zabezpieczenie właściwości zależności

Właściwości zależności powinny być zwykle uważane za właściwości publiczne. Charakter systemu właściwości Windows Presentation Foundation (WPF) uniemożliwia zapewnienie zabezpieczeń gwarancji dotyczących wartości właściwości zależności.

Dostęp i zabezpieczenia właściwości otoki i zależności

Zazwyczaj właściwości zależności są implementowane wraz z właściwościami środowiska uruchomieniowego języka wspólnego (CLR) "otoki", które upraszczają pobieranie lub ustawianie właściwości z wystąpienia. Jednak otoki są naprawdę tylko metodami wygody, które implementują bazowe GetValue i SetValue statyczne wywołania, które są używane podczas interakcji z właściwościami zależności. Myśląc o tym w inny sposób, właściwości są uwidocznione jako właściwości środowiska uruchomieniowego języka wspólnego (CLR), które mają być wspierane przez właściwość zależności, a nie przez pole prywatne. Mechanizmy zabezpieczeń stosowane do otoek nie są równoległe zachowanie systemu właściwości i dostęp do bazowej właściwości zależności. Umieszczenie żądania zabezpieczeń na otoce uniemożliwi użycie metody wygody, ale nie zapobiegnie wywołaniom GetValue lub SetValue. Podobnie umieszczenie chronionego lub prywatnego poziomu dostępu na otoce nie zapewnia żadnych skutecznych zabezpieczeń.

Jeśli piszesz własne właściwości zależności, należy zadeklarować otoki i DependencyProperty pole identyfikatora jako elementy członkowskie publiczne, aby osoby wywołujące nie pobierały wprowadzających w błąd informacji o prawdziwym poziomie dostępu tej właściwości (ze względu na implementację jej magazynu jako właściwość zależności).

W przypadku niestandardowej właściwości zależności można zarejestrować właściwość jako właściwość zależności tylko do odczytu, a to zapewnia skuteczny sposób zapobiegania ustawianiu właściwości przez wszystkich, którzy nie posiadają odwołania do DependencyPropertyKey tej właściwości. Aby uzyskać więcej informacji, zobacz Właściwości zależności tylko do odczytu.

Uwaga

Deklarowanie prywatnego pola identyfikatora DependencyProperty nie jest zabronione i może być używane w celu zmniejszenia natychmiast uwidocznionej przestrzeni nazw klasy niestandardowej, ale taka właściwość nie powinna być traktowana jako "prywatna" w tym samym sensie, co definicje języka wspólnego środowiska uruchomieniowego (CLR) definiują ten poziom dostępu, z powodów opisanych w następnej sekcji.

Ekspozycja systemu właściwości zależności

Nie jest to ogólnie przydatne i potencjalnie mylące, deklarowanie DependencyProperty poziomu dostępu innego niż publiczny. To ustawienie poziomu dostępu uniemożliwia tylko komuś uzyskanie odwołania do wystąpienia z klasy deklaratywnej. Istnieje jednak kilka aspektów systemu właściwości, które będą zwracać DependencyProperty jako środek identyfikacji określonej właściwości, ponieważ istnieje w wystąpieniu klasy lub wystąpienia klasy pochodnej, a ten identyfikator jest nadal używany w SetValue wywołaniu, nawet jeśli oryginalny identyfikator statyczny jest zadeklarowany jako niepublikowy. OnPropertyChanged Ponadto metody wirtualne odbierają informacje o istniejącej właściwości zależności, która zmieniła wartość. Ponadto GetLocalValueEnumerator metoda zwraca identyfikatory dowolnej właściwości w wystąpieniach z lokalnie ustawioną wartością.

Walidacja i zabezpieczenia

Zastosowanie żądania do ValidateValueCallback elementu i spodziewanie się niepowodzenia walidacji na żądanie, aby zapobiec ustawieniu właściwości, nie jest odpowiednim mechanizmem zabezpieczeń. Unieważnienie wartości ustawionej wymuszone za pomocą metody ValidateValueCallback może również zostać pominięte przez złośliwych wywołań, jeśli te osoby wywołujące działają w domenie aplikacji.

Zobacz też