2011-10-20 8 views
5

बेस कक्षाएं:पेज और उपयोगकर्ता नियंत्रण दोनों के लिए बेस क्लास कैसे बनाएं? के लिए पृष्ठ और UserControl

public class MyWebPage : System.Web.UI.Page { } 

public class MyUserControl : System.Web.UI.UserControl { } 

हेल्पर उनमें से किसी का भी उपयोग हो सकता है कि:

void SetSessionValue<T>(string key, T value) { Session[key] = value; } 

मैं निम्नलिखित की तरह कुछ कैसे प्राप्त कर सकते हैं?

public class WebObject // can't inherit from both Page and UserControl { 
    protected void SetSessionValue<T>(string key, T value) { 
     Session[key] = value; 
    } 
} 

public class MyWebPage : WebObject { } 

public class MyUserControl : WebObject { } 

अद्यतन: मैं उम्मीद कर रहा मैं इसे इस तरह से हल कर सकते थे एक पल के लिए भी बड़े उत्साहित थे, लेकिन अफसोस यह संकलन नहीं है।

public class WebObject<T> : T 
{ 
} 
public class MyWebPage : WebObject<System.Web.UI.Page> 
{ 
} 
+1

आपके पास इस तरह के कई तरीके होंगे, और प्रत्येक विधि में कितना कोड होगा? कोड को डुप्लिकेट क्यों न करें?यह एक लाइनर इस बारे में चिंता करने के लिए छोटा रास्ता लगता है। साथ ही, यदि 'पृष्ठ' और 'UserControl' के पास कोई सामान्य आधार वर्ग है, तो आप उस प्रकार पर एक विस्तार विधि बना सकते हैं। जैसे 'System.Web.UI.Control' या' System.Web.UI.TemplateControl' पर - आप केवल तभी ऐसा कर सकते हैं यदि आपको अपनी कस्टम बेस क्लास से राज्य की आवश्यकता नहीं है। –

उत्तर

4

आप नहीं कर सकते। वैसे भी आसानी से नहीं। मैं केवल पृष्ठों और उपयोगकर्ता नियंत्रणों के लिए बेस क्लास बनाने और दोनों में सामान्य कोड को डुप्लिकेट करने की अनुशंसा करता हूं। के बाद से उपयोगकर्ता नियंत्रण पृष्ठों में समाहित कर रहे हैं, आप भी बस अपने प्रकार के Page संपत्ति कास्टिंग द्वारा आधार पृष्ठ वर्ग के लिए आधार उपयोगकर्ता नियंत्रण कक्षा में तरीकों को सौंपने कर सकते हैं:

// Code in the MyUserControlBase class 
public int SomeCommonMethod() { 
    return ((MyBasePageType)this.Page).SomeCommonMethod(); 
} 

आप भी अपने जीवन से दुखी कर सकते हैं आधार वर्ग दोनों द्वारा कार्यान्वित एक इंटरफ़ेस बनाना और डीआई को इंटरसेप्ट विधि और संपत्ति एक्सेसर कॉल का उपयोग करना, जिसे तब किसी प्रकार की सामान्य सरोगेट कक्षा में भेजा जाएगा जो वास्तव में कार्यान्वयन प्रदान करता है। मैं शायद वहां नहीं जाऊंगा :)

+0

मैंने बेस पेज द्वारा बनाई गई एक कॉन्टेक्स्ट क्लास बनाने और यहां अपने स्निपेट में वर्णित पैटर्न का उपयोग करके नियंत्रण आधार पर प्रॉपर्टी एक्सेसर प्राप्त करने का अंत किया - धन्यवाद। –

1

IIRC दोनों पृष्ठ और UserControl TemplateControl से विरासत ताकि आप उस से विरासत में सक्षम हो सकता है।

+0

हाँ मैं इसे देख रहा था। ध्यान दें कि सत्र संपत्ति टेम्पलेट नियंत्रण कक्षा में नहीं है। अगर ऐसा होता तो उसे टेम्पलेट नियंत्रण में एक विस्तार विधि जोड़ने की आवश्यकता होगी। – AaronLS

1

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

कुछ की तरह:

public class ApplicationContext 
{ 
    // Private constructor to prevent instantiation except through Current property. 
    private ApplicationContext() {} 

    public static ApplicationContext Current 
    { 
     get 
     { 
      ApplicationContext current = 
       HttpContext.Current.Items["AppContext"] as ApplicationContext; 
      if (current = null) 
      { 
       current = new ApplicationContext(); 
       HttpContext.Current.Items["AppContext"] = current; 
      } 
      return current; 
     } 
    } 

    public void SetSessionValue<T>(string key, T value) 
    { 
     HttpContext.Current.Session[key] = value; 
    } 
    ... etc ... 
} 

एक एकल ApplicationContext उदाहरण वर्तमान अनुरोध के जीवन भर के लिए रहते हैं, और आप अपने यूआई स्तरीय कोड में कहीं से भी ApplicationContext.Current.SetSessionValue और अन्य सामान्य सदस्यों का उपयोग कर सकते हैं।

मैं अक्सर इस तरह के सहायक वर्ग में आपके SetSessionValue जैसे सामान्य प्रयोजन विधियों को रखने से आगे जाता हूं, और इसमें वहां विशिष्ट विशिष्ट गुण हो सकते हैं, उदा।

public class ApplicationContext 
{ 
    ... as above ... 

    public ShoppingBasket ShoppingBasket 
    { 
     ShoppingBasket shoppingBasket = 
      HttpContext.Current.Session["Basket"] as ShoppingBasket; 
     if (shoppingBasket == null) 
     { 
      shoppingBasket = ... e.g. retrieve from database 
      HttpContext.Current.Session["Basket"] = shoppingBasket; 
     } 
     return shoppingBasket; 
    } 
} 

इस तरह से आप यह जानकर या देखभाल कि यह सत्र में कैश है बिना अपने UI में कहीं भी वर्तमान ShoppingBasket उदाहरण का उपयोग कर सकते हैं - कि एक कार्यान्वयन केवल अपने ApplicationContext वर्ग के लिए जाना जाता विवरण दिया गया है।

0
  • 1) कार्यों आप
  • 2 की जरूरत है, एक स्थिर वर्ग सभी चर है कि सुनिश्चित करें) अपनी UserControl और पृष्ठ वर्ग है, और इन कक्षाओं Pre_Init में अपने स्थिर कार्यों फोन बनाने के लिए और लोड ओवरराइड करता है
  • 3) प्रत्येक पृष्ठ को अपनी मूल कक्षाओं का उत्तराधिकारी बनाएं।

यह सबसे आसान तरीका है।

+0

मुझे नहीं लगता कि एक अच्छा विचार है। स्टेटिक क्लासेस निर्भरता इंजेक्शन का दुश्मन हैं और आपको आसान परीक्षण के लिए मोक्स बनाने की अनुमति नहीं देते हैं। वे सिंगलटन भी हैं जो अच्छी तरह से काम नहीं कर सकते हैं। यदि आप एक सहायक वर्ग चाहते हैं जो दोनों वर्गों का उपयोग करें; एक सामान्य वर्ग बनाएं जो एक इंटरफ़ेस का कार्यान्वयन है और उन ऑब्जेक्ट्स के इंटरफ़ेस को उन ऑब्जेक्ट्स में इंजेक्ट करें जिन्हें आपको उन वस्तुओं के निर्माण पर चाहिए। इस तरह आप आसानी से परीक्षण के लिए अपनी इच्छाओं को मजाक कर सकते हैं और आप अपने कोड को कूड़े हुए और परीक्षण करने में कठोर परिश्रम के साथ समाप्त नहीं होते हैं। –

संबंधित मुद्दे