2010-12-16 22 views
5

Uygulama Rolleri için kullanıcı arabirimi öğelerini yetkilendirmek için en iyi yaklaşım hakkında genel bir sorum var. Demek istediğim bir Yönetici, düzenli bir Kullanıcının göremediği düğmeleri, menü öğelerini, vb. Görebilir. Bunun için en iyi uygulama nedir?.NET'teki Kullanıcı Arabirimi Yetkilendirmeleri WinForms

Role (kesinlikle bir kullanıcı için, vb.), Aynı derecede overkill gibi görünen bir ekrana dayalı birden çok ekran olabileceğini anlıyorum. Ayrıcalık Ayrılığını da korumak istiyorum, bu yüzden yetkilendirme kodum görüntü işleviyle karıştırılmıyor. Ben yapmak istediğim tam olarak ne neredeyse görünüyor PostSharp ile Yönleri bakarak edilmiştir

if(current_user.IsInRole("administrator")) 
    button.Enabled = true; 

, ancak mantıksal olarak UI uzatmak görünmüyor: Başka bir deyişle, ben önlemek istiyorum.

Eminim ki bir şey kaçırmıyorum, ne var?

Teşekkür - senin kod sonunda gizlemek için UI öğeleri bir listesini hazırlamak veya belirli bir eylemi gerçekleştirmek ve ardından geçerli rolüne göre bu eylemleri gerçekleştirmek olasıdır görünüyor

cevap

5

.

Bu listeyi esas olarak sorduğunuz soru nasıl derlenir. AOP çerçeveleri kesinlikle endişelerin ayrılmasına yardımcı olur, ancak bir homebrew çözümü imkansız değildir. parametresi role ile

  • bir EnableForRoleAttribute oluşturun: Ben böyle bir şey düşünüyorum.
  • Formlarınıza yansıtın (büyük olasılıkla formları bulmak için yansıma kullanarak veya bunları doğrudan kodunuza sağlayarak veya hatta oluşturduğunuz formun bir RoleVaryingAttribute ile dekore edilmiş formları bulurken).
  • Formlarınızdaki alanları, Control örnekleri için filtreleyin, ardından EnableForRoleAttribute ile Control örnekleri için yansıtın.
  • Şimdi listeniz var! Rolüne göre Enabled'u ayarlayın. nitelikler :(parametre olarak lambdas alamazlar. Bir parametreler role, propertyName ile SetPropertyIfInRoleAttribute ve propertyValue. Veya bu tür ile daha esnek olabilir çünkü esas

yukarıda işaretli liste, sizin Enabled örnek özgüdür . inşaat

Temelde, AOP çerçeveler daha kolay sizin için bu işi yapmak ve PostSharp gibi bazı yerine çalışma zamanının derleme zamanında gerçekleşmesi Ama homebrew çözüm de oldukça geçerlidir

+0

Domenic -.. sayesinde SetPropertyIfInRoleAttribute (veya SetPropertyByRole Öznitelik) güzel bir orta zemine benziyor ve bu andan itibaren bu yöne yaslanıyorum. Büyük açıklama, açıklık için teşekkürler. Şimdi görüyorum, bir Attribute kurucusundaki lambda çok yararlı olurdu! – grefly

+0

Bir takip etme sırasında, PostSharp kullanarak koştuğum şey, özel bir öznitelik alamadım, çünkü .NET framework sınıflarını (metin kutuları, vb.) Bir örnek düzeyinde süslüyorum. Sanırım yine aynı konuya geçeceğim. Orijinal soruya büyük bir cevap vermiş olmanıza rağmen, bir cevap genellikle iki soruya yol açar ... = D – grefly

İlgili konular