2012-06-19 8 views
5

में डीआरवाई सिद्धांत के बाद मैंने हाल ही में क्लासिक एएसपी.नेट परियोजना में शामिल किया है जिसमें सत्र और क्वेरी स्ट्रिंग से मूल्यों को संग्रहीत करने और पढ़ने के बहुत सारे शामिल हैं। यह कुछ निम्न जैसा दिख सकता है:एएसपी.नेट

Session["someKey"]=someValue; 

और कोड में कहीं और सत्र में मूल्य पढ़ा जाता है। स्पष्ट रूप से यह DRY सिद्धांत का उल्लंघन करता है क्योंकि आपके पास शब्द भर में शाब्दिक स्ट्रिंग कुंजी फैल जाएगी। इससे बचने का एक तरीका सभी चाबियों को स्थिरांक के रूप में स्टोर करना हो सकता है जिसे हर जगह संदर्भित किया जा सकता है, सत्र को पढ़ने और लिखने की आवश्यकता है। लेकिन मुझे यकीन नहीं है कि ऐसा करने का सबसे अच्छा तरीका है। आप कैसे सलाह देंगे कि मैं इसे सबसे अच्छी तरह से संभालूं ताकि मैं DRY सिद्धांत का उल्लंघन न करूं?

उत्तर

7

एक अलग सार्वजनिक वर्ग जहाँ आप अपने स्थिरांक परिभाषित कर सकते हैं, जैसे

public class SessionVars 
{ 
    public const string SOME_KEY = "someKey"; 
    public const string SOME_OTHER_KEY = "someOtherKey"; 
} 

और फिर अपने कोड में कहीं भी आप इस तरह सत्र चर का उपयोग कर सकते बनाएँ:

Session[SessionVars.SOME_KEY]=someValue; 

इस तरह से आप प्राप्त कर सकते हैं IntelliSence और अन्य घंटियाँ और सीटी।

+0

+1 यह पैटर्न मैं पालन करती हैं वारिस कभी नहीं चाहते हैं। –

+1

आपको इस संदर्भ में 'const' का उपयोग नहीं करना चाहिए। 'स्थिर रीडोनली 'अधिक उपयुक्त (और सुरक्षित) है। – EkoostikMartin

+1

वह अपने आप को दोहराने के सिद्धांत को कम कैसे कर रहा है? आप अभी भी वही 1 लाइनर लिख रहे हैं, आप कुंजी के लिए एक उदाहरण स्ट्रिंग के बजाय स्थिर चर का उपयोग कर रहे हैं? – BlackSpy

2

मुझे लगता है कि आप DRY में बहुत अधिक पढ़ रहे हैं। मैं उन चीजों से अधिक संबंधित हूं जो एक समारोह में लपेटा जा सकता है। अर्थात। पूरे स्थान पर एक ही फिव लाइनों को दोहराने के बजाय उन 5 लाइनों को फ़ंक्शन में लपेटें और जहां भी आपको इसकी आवश्यकता हो, फ़ंक्शन को कॉल करें।

आपके पास एक उदाहरण के रूप में क्या है जो सिर्फ एक शब्द (इस मामले में सत्र ऑब्जेक्ट) में एक मान निर्धारित कर रहा है, और यह वस्तुओं को संग्रहीत करने और पुनर्प्राप्त करने का सबसे आसान तरीका है।

+1

मैं तुम्हें एक परियोजना के * जादू * बनाए रखने के लिए अपनी जरूरत के तार पूर्ण ... –

0

वैकल्पिक रूप से आप एक आधार पेज में इस सत्र वस्तु का उपयोग करने लगा सके और एक संपत्ति में लपेट:

class BasePage : Page 
{ 
    ... 
    public string MySessionObject 
    { 
     get 
     { 
     if(Session["myKey"] == null) 
      return string.Empty; 
     return Session["myKey"].ToString(); 
     } 
     set 
     { 
      Session["myKey"] = value; 
     } 
    } 
    ... 
} 

यहाँ आप myKey स्ट्रिंग दोहरा रहे हैं, लेकिन यह संपत्ति में समझाया गया है। यदि आप इसे टालने के चरम पर जाना चाहते हैं, तो कुंजी के साथ स्थिर बनाएं और स्ट्रिंग को प्रतिस्थापित करें।

1

मैं मुझे के जीवन मैं कहाँ विनम्रतापूर्वक सोद्देश्य से इस कोड के लिए याद कर सकते हैं नहीं है, लेकिन यह बहुत अच्छा है:

using System; 
using System.Web; 

namespace Project.Web.UI.Domain 
{ 
    public abstract class SessionBase<T> where T : class, new() 
    { 
     private static readonly Object _padlock = new Object(); 

     private static string Key 
     { 
      get { return typeof(SessionBase<T>).FullName; } 
     } 

     public static T Current 
     { 
      get 
      { 
       var instance = HttpContext.Current.Session[Key] as T; 

       lock (SessionBase<T>._padlock) 
       { 
        if (instance == null) 
        { 
         HttpContext.Current.Session[Key] 
          = instance 
          = new T(); 
        } 
       } 
       return instance; 
      } 
     } 

     public static void Clear() 
     { 
      var instance = HttpContext.Current.Session[Key] as T; 
      if (instance != null) 
      { 
       lock (SessionBase<T>._padlock) 
       { 
        HttpContext.Current.Session[Key] = null; 
       } 
      } 
     } 
    } 
} 

इसके पीछे विचार दो गुना। बनाया गया प्रकार केवल एकमात्र प्रकार होना चाहिए जो आपको चाहिए। यह मूल रूप से एक बड़ा दृढ़ता से टाइप रैपर है। तो आप किसी वस्तु है आप में जानकारी का विस्तार रखना चाहते हैं:

public class MyClass 
{ 
    public MyClass() 

    public string Blah1 { get; set; } 
} 

फिर सड़क के नीचे आप MyClass का विस्तार करने और आप नहीं है सभी कुंजी मान याद करने के लिए, उन्हें AppSettings या में कॉन्स्ट चर में स्टोर चाहते हैं स्टेटिक क्लासेस

public class MyClassSession : SessionBase<MyClass> 
{ 
} 

और कहीं भी अपने कार्यक्रम में आप बस वर्ग का उपयोग करें: आप बस क्या आप संग्रहीत करना चाहते हैं परिभाषित करते हैं। यह वास्तव में उन परेशान करने टाइपो कीड़े खत्म करने में मदद करता है -

// Any Asp.Net method (webforms or mvc) 
public void SetValueMethod() 
{ 
    MyClassSesssion.Current.Blah1 = "asdf"; 
} 

public string GetValueMethod() 
{ 
    return MyClassSession.Current.Blah1; 
}