2010-12-16 12 views
5

में UI तत्वों का प्रमाणीकरण मेरे पास एप्लिकेशन भूमिकाओं के लिए UI तत्वों को अधिकृत करने के लिए सर्वोत्तम दृष्टिकोण के बारे में एक सामान्य प्रश्न है। मेरा मतलब है कि एक प्रशासक बटन, मेनू आइटम इत्यादि देख सकता है, जो एक नियमित उपयोगकर्ता नहीं देख सकता है। इसके लिए सबसे अच्छा अभ्यास क्या है?.NET WinForms

मुझे एहसास है कि रोल (एक एडमिन स्क्रीन, उपयोगकर्ता के लिए डुप्लिकेट की गई एक ही स्क्रीन, आदि) के आधार पर कई स्क्रीन हो सकती हैं, जो निश्चित रूप से ओवरकिल की तरह लगती हैं। मैं भी चिंता का पृथक्करण रखना चाहता हूं, इसलिए मेरा प्राधिकरण कोड प्रदर्शन कार्यक्षमता के साथ अंतःस्थापित नहीं है। दूसरे शब्दों में, मैं से बचना चाहते हैं:

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

मैं PostSharp, जो लगता है लगभग वास्तव में क्या मैं क्या करना चाहते हैं के साथ पहलुओं को देखकर किया गया है, लेकिन यह तार्किक यूआई के लिए विस्तार करने के लिए प्रतीत नहीं होता।

मुझे यकीन है कि मुझे कुछ याद आ रहा है, यह क्या है?

धन्यवाद -

उत्तर

5

यह संभावना है कि अपने कोड अंत में छिपाने के लिए यूआई तत्वों की सूची संकलित कर देगा, या करने के लिए एक दिया क्रिया को निष्पादित, और उसके बाद वर्तमान भूमिका के आधार पर उन कार्यों प्रदर्शन करते हैं। कुछ

Dictionary<Control, Action<Control, string>> actions = new Dictionary<Control, Action<Control, string>> 
{ 
    { button, (c, r) => c.Enabled = (r == "administrator") }, 
    // etc. 
}; 

आप कैसे संकलित करते हैं कि यह सूची मुख्य रूप से आपके प्रश्न से संबंधित है। एओपी ढांचे निश्चित रूप से चिंताओं को अलग करने में मदद करते हैं, लेकिन होमब्री समाधान असंभव नहीं होगा। मैं की तरह कुछ सोच रहा हूँ:

  • एक EnableForRoleAttribute बनाएँ, पैरामीटर role साथ।
  • अपने रूपों पर प्रतिबिंबित करें (संभावित रूप से फ़ॉर्म ढूंढने के लिए प्रतिबिंब का उपयोग करके, या संभवतः उन्हें सीधे अपने कोड में प्रदान करना, या यहां तक ​​कि RoleVaryingAttribute के साथ सजाए गए फॉर्म ढूंढना)।
  • Control उदाहरणों के लिए फ़िल्टरिंग, उदाहरण EnableForRoleAttribute के साथ फ़िल्टर करने के लिए अपने फॉर्म के फ़ील्ड पर प्रतिबिंबित करें।
  • अब आपकी सूची है! भूमिका के आधार पर Enabled सेट करें।

ऊपर बुलेटेड सूची, अपने Enabled उदाहरण के लिए विशिष्ट है जिसका मुख्य कारण गुण पैरामीटर के रूप में lambdas :(नहीं ले। आप मापदंडों role, propertyName के साथ एक SetPropertyIfInRoleAttribute, और propertyValue। या किसी भी तरह के साथ और अधिक लचीला हो सकता है कर सकते हैं । निर्माण

असल में, AOP चौखटे आपके लिए आसान यह काम करते हैं, और PostSharp जैसे कुछ यह क्रम के बजाय संकलन समय में ऐसा करने लेकिन homebrew समाधान भी बहुत मान्य है

+0

Domenic -।। धन्यवाद, SetPropertyIfInRoleAttribute (या SetPropertyByRole विशेषता) एक अच्छा मध्य मैदान की तरह लगता है, और इस पल के रूप में मैं उस तरह झुका रहा हूँ। महान स्पष्टीकरण, स्पष्टीकरण के लिए धन्यवाद। अब मैं देखता हूं, एक विशेषता निर्माता में लैम्ब्डा बहुत उपयोगी होगा! – grefly

+0

एक अनुवर्ती के रूप में, पोस्टशर्प का उपयोग करने में मैंने जो भाग लिया था वह यह था कि मुझे कस्टम विशेषता नहीं मिल सका क्योंकि मैं एक उदाहरण स्तर पर .NET फ्रेमवर्क क्लासेस (टेक्स्टबॉक्स, आदि) को सजा रहा हूं। मुझे लगता है कि मैं एक ही मुद्दे में फिर से भाग जाऊंगा। यद्यपि आपने मूल प्रश्न का एक बड़ा उत्तर प्रदान किया है, लेकिन एक जवाब अक्सर दो और प्रश्नों की ओर जाता है ... = डी – grefly