2009-01-21 6 views
9

के बजाय करक्या सत्र मूल्यों के प्रमुख नामों के लिए एक enum बनाने का अच्छा विचार है?

session("myvar1") = something 
session("myvar2") = something 
session("myvar3") = something 
session("myvar4") = something 

enum sessionVar 
    myvar1 
    myvar2 
    myvar3 
    myvar4 
end enum 


session(sessionVar.myvar1.tostring) = something 
session(sessionVar.myvar2.tostring) = something 
session(sessionVar.myvar3.tostring) = something 
session(sessionVar.myvar4.tostring) = something 

कर रहा है बेहतर होगा?

+0

मेरा सुझाव है फिर से टैगिंग के रूप में सत्र-चर और सत्र-राज्य के रूप में अच्छी तरह से। –

उत्तर

17
सत्र चाबी के लिए स्थिरांक उपयोग करने के बजाय

, मैं अपने ही प्रकार सुरक्षित सत्र वस्तु का उपयोग कर रहा हूँ, जो इस तरह दिखता है (खेद इस सी # में, एक वीबी संस्करण के लिए नीचे देखें):

public class MySession 
{ 
    // Private constructor (use MySession.Current to access the current instance). 
    private MySession() {} 

    // Gets the current session. 
    public static MySession Current 
    { 
    get 
    { 
     MySession session = HttpContext.Current.Session["__MySession__"] as MySession; 
     if (session == null) 
     { 
     session = new MySession(); 
     HttpContext.Current.Session["__MySession__"] = session; 
     } 
     return session; 
    } 
    } 

    // My session data goes here: 
    public string MyString { get; set; }; 
    public bool MyFlag { get; set; }; 
    public int MyNumber { get; set; }; 
} 

जब भी मैं पढ़ने की जरूरत है/कुछ लिखना बात करने के लिए/सत्र से, मैं अपने typesafe सत्र वस्तु इस तरह उपयोग कर सकते हैं:

string s = MySession.Current.MyString; 
s = "new value"; 
MySession.Current.MyString = s; 

यह समाधान परिणाम कई फायदे में: मैं एक typesafe सत्र (कोई और अधिक प्रकार डाले) है

  • मैं सभी सत्र आधारित डेटा (MySession में सार्वजनिक गुणों पर टिप्पणी करके) दस्तावेज कर सकता हूं
  • सत्र में नया तत्व जोड़ते समय, मुझे यह जांचने के लिए समाधान की आवश्यकता नहीं है कि क्या सत्र सत्र कुंजी पहले से उपयोग किया गया था कहीं और।

अद्यतन: यहाँ एक वीबी संस्करण (स्वचालित रूप से सी # संस्करण से परिवर्तित) है। क्षमा करें, लेकिन मैं वीबी पता नहीं है और इसलिए मैं कैसे VB में गुण लिखने के लिए पता नहीं था:

Public Class MySession 
    ' Private constructor (use MySession.Current to access the current instance). 
    Private Sub New() 
    End Sub 

    ' Gets the current session. 
    Public Shared ReadOnly Property Current() As MySession 
     Get 
      Dim session As MySession = TryCast(HttpContext.Current.Session("__MySession__"), MySession) 
      If session = Nothing Then 
       session = New MySession() 
       HttpContext.Current.Session("__MySession__") = session 
      End If 
      Return session 
     End Get 
    End Property 

    ' My session data goes here: 
    Public MyString As String 
    Public MyFlag As Boolean 
    Public MyNumber As Integer 
End Class 
+0

यह साफ और सरल है। मुझें यह पसंद है। –

+0

शायद फ्रेडौ के लिए एक वीबी संस्करण पोस्ट करें। –

+0

इस दृष्टिकोण का नकारात्मक पक्ष यह है कि आप एक आईनेमरेबल कार्यान्वयन की पेशकश नहीं करते हैं, लेकिन कोई तर्क दे सकता है कि किसी प्रकार की सूचियों के रूप में संग्रहीत जटिल प्रकारों को छोड़कर इसकी आवश्यकता नहीं होनी चाहिए। –

9

केवल तभी जब वे मान संबंधित हैं। अन्यथा सादे पुराने स्थिरांक का उपयोग करें।

+0

मैं अगले एएसपी.Net –

+1

में एक प्रकार से सुरक्षित सत्र की उम्मीद कर रहा हूं .toString की आवश्यकता को हटा देगा, जो बहुत अच्छा है – Fredou

+0

@ जोएल: मेरे दृष्टिकोण के लिए मेरा उत्तर देखें – M4N

4

कैसे के बारे में: - आप उपयोग करना

public static class SessionVar 
{ 
    public static readonly string myVar1 = "myVar1"; 
    public static readonly string myVar2 = "myVar2"; 
    public static readonly string myVar3 = "myVar3"; 
    public static readonly string myVar4 = "myVar4"; 
} 

यह अनुमति देता है: -

session(SessionVar.myVar1) = something; 
+0

आप केवल पढ़ने के लिए उपयोग क्यों करते हैं सत्र कुंजी स्ट्रिंग के लिए कॉन्स्ट? – BornToCode

0

स्ट्रिंग कुंजी संदर्भ के सभी को दूर करने के सरल बात के लिए, मैं वैश्विक स्थिर साथ जाना होगा/साझा दायरे में दिखाई देने वाले साझा स्थिरांक।

अन्यथा, सत्र चर के लिए दृढ़ता से टाइप किए गए सरल रैपर एक बेहतर विकल्प हैं, और यह अधिक ओओपी-अनुकूल है क्योंकि आपको इंटेलिजेंस और ऑब्जेक्ट ब्राउज़र संगतता मिलती है।

एकमात्र तरीका मैं एनम को अधिक मूल्य के रूप में देख सकता हूं जिसका उपयोग सरणी या इसी तरह की सूची में इंडेक्स करने के लिए किया जाना है। लेकिन तब भी आपको en int को enum डालना होगा।

तो, आपके पास एक सरणी हो सकती है जिसे आप अपने सभी सत्र चर कुंजी के साथ एप्लिकेशन स्टार्टअप पर लोड करते हैं और फिर अनुक्रमणिका के लिए एक enum। हालांकि, यह देखते हुए कि सत्र ऑब्जेक्ट HttpSessionState से प्राप्त होता है, जो IENumerable से प्राप्त होता है, आपको केवल सत्र चरों पर फ़ोरैच लूप करने में सक्षम होना चाहिए, यदि आपको आवश्यकता हो।

0

मैंने टाइप किए गए सत्र/कैश रैपर बनाने के लिए इस तरह के वर्गों का उपयोग किया है। आपको प्राप्त/सेट में अतिरिक्त कोड जोड़ने की आवश्यकता हो सकती है, लेकिन मैं इसे आपके पास छोड़ दूंगा।

internal class SessionHelper 
{ 
    private const string myVar1Key = "myvar1"; 

    public static int MyVar1 
    { 
     get 
     { 
      return (int)System.Web.HttpContext.Current.Session[myVar1Key]; 
     } 
     set 
     { 
      System.Web.HttpContext.Current.Session[myVar1Key] = value; 
     } 
    } 
} 

के बारे में सी # क्षमा करें ....

0

मुझे पता है इस सवाल का कुछ समय पहले कहा था और एक "जवाब" पहले से ही उठाया गया है। लेकिन मैं बस इसे पार आया। मार्टिन का जवाब अच्छा है। हालांकि, भविष्य में इस पर फंसे किसी भी व्यक्ति की सहायता करने के लिए, यदि आप वास्तव में सत्र से निपटने का एक आसान तरीका चाहते हैं, तो यह post पढ़ें। मुझे नहीं लगता कि आपको कुछ भी आसान लगेगा।

0

मैं ऐसे समाधान के साथ आया जो सत्र चर के ढांचे को बरकरार रखकर पोस्ट किए गए अन्य समाधानों के कुछ नुकसान से बचाता है। यह सत्र चरों को प्राप्त करने और सेट करने के लिए बस एक प्रकार का सुरक्षित शॉर्टकट है।

यह सी # है, लेकिन मैंने अंत में कुछ ऑटो-जेनरेट किए गए वीबी.नेट पोस्ट किए।

मेरे द्वारा देखे गए सर्वोत्तम समाधान (स्वीकृत उत्तर और TheObjectGuy द्वारा एक) को एक कस्टम क्लास की आवश्यकता होती है जो एक सत्र चर में संग्रहीत होती है, और उसके बाद सत्र से खींच लिया जाता है ताकि MySessionClass.Current जैसे कुछ गुणों का उपयोग किया जा सके। मेरी जायदाद।

इस समस्या में यह है कि यदि आप वर्तमान में इनप्रोक सत्र-राज्य मोड के अलावा कुछ (या भविष्य में उपयोग कर सकते हैं) (https://msdn.microsoft.com/en-us/library/ms178586%28v=vs.140%29.aspx देखें), तो पूरी कक्षा को सिंगल तक पहुंचने के लिए क्रमबद्ध करना होगा संपत्ति।

इसके अलावा, इसका मतलब है कि यदि आप उन लोगों की ज़रूरत है, तो वास्तविक सत्र द्वारा प्रदान की जाने वाली आईन्यूमेरेबल और आईसीओलेक्शन कार्यान्वयन खो देते हैं। मेरे समाधान के साथ, यदि आपको इस कार्यक्षमता की आवश्यकता है तो आप वास्तविक सत्र तक पहुंच सकते हैं।

आप आसानी से इन सत्र चर का उपयोग कर सकते हैं और वे टाइप-सुरक्षित हैं। इसका उपयोग सत्र ["माईप्रोपर्टी"] जैसे वक्तव्यों के साथ किया जा सकता है, जो एक समय में एक मौजूदा परियोजना के एक संदर्भ को बदलने की अनुमति देगा। तो:

int myInt = (int)Session["MyInt"]; 
Session["MyInt"] = 3; 

हो जाता है:

int myInt = SessionVars.MyInt; 
SessionVars.MyInt = 3; 

यहाँ वास्तविक वर्ग है। कॉलरमेम्बरनाम को .NET 4.5 की आवश्यकता है, लेकिन यदि आप पुराने संस्करण का उपयोग कर रहे हैं तो भी आप संपत्ति नाम को स्पष्ट रूप से पास करके इसे प्रबंधित कर सकते हैं। इसके अलावा, गुण के प्रकार यह मानक सत्र [ "MyProp"] के रूप में बिल्कुल वैसा ही कार्य करने के लिए नल होना चाहिए कॉल क्योंकि एक गैर सेट

public static class SessionVars 
{ 
    private static T Get2<T>([System.Runtime.CompilerServices.CallerMemberName] string propertyName = "") 
    { 
     if (HttpContext.Current.Session[propertyName] == null) 
     { 
      return default(T); 
     } 

     return (T)HttpContext.Current.Session[propertyName]; 
    } 

    private static void Set2<T>(T value, [System.Runtime.CompilerServices.CallerMemberName] string propertyName = "") 
    { 
     HttpContext.Current.Session[propertyName] = value; 
    } 

    public static int MyInt { get { return Get2<int>(); } set { Set2<int>(value); } } 
    public static bool MyBool { get { return Get2<bool>(); } set { Set2<bool>(value); } } 
    public static string MyString { get { return Get2<string>(); } set { Set2<string>(value); } } 
} 

मैं भी इन गुणों को जोड़ने की सुविधा के लिए एक कोड का टुकड़ा लिखा है:

<?xml version="1.0" encoding="utf-8"?> 
<CodeSnippet Format="1.0.0" xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet"> 
    <Header> 
    <Title>SessionVars Property</Title> 
    <Author>kevinpo</Author> 
    <Shortcut>sv</Shortcut> 
    <Description>Adds a property for use in a SessionVars class</Description> 
    <SnippetTypes> 
     <SnippetType>Expansion</SnippetType> 
    </SnippetTypes> 
    </Header> 
    <Snippet> 
    <Declarations> 
     <Literal> 
     <ID>type</ID> 
     <Default>int</Default> 
     </Literal> 
     <Literal> 
     <ID>property</ID> 
     <Default>PropertyName</Default> 
     </Literal> 
    </Declarations> 
    <Code Language="CSharp"> 
     <![CDATA[public static $type$ $property$ { get { return Get2<$type$>(); } set { Set2<$type$>(value); } }]]> 
    </Code> 
    </Snippet> 
</CodeSnippet> 

मैं एक सी # पुरुष हूँ, इसलिए इस VB.NET सिर्फ स्वतः रूपांतरित http://converter.telerik.com/ कर रहा है:

Public NotInheritable Class SessionVars 
    Private Sub New() 
    End Sub 
    Private Shared Function Get2(Of T)(<System.Runtime.CompilerServices.CallerMemberName> Optional propertyName As String = "") As T 
     If HttpContext.Current.Session(propertyName) Is Nothing Then 
      Return Nothing 
     End If 
     Return DirectCast(HttpContext.Current.Session(propertyName), T) 
    End Function 

    Private Shared Sub Set2(Of T)(value As T, <System.Runtime.CompilerServices.CallerMemberName> Optional propertyName As String = "") 
     HttpContext.Current.Session(propertyName) = value 
    End Sub 

    Public Shared Property MyInt() As Integer 
     Get 
      Return Get2(Of Integer)() 
     End Get 
     Set 
      Set2(Of Integer)(value) 
     End Set 
    End Property 
    Public Shared Property MyBool() As Boolean 
     Get 
      Return Get2(Of Boolean)() 
     End Get 
     Set 
      Set2(Of Boolean)(value) 
     End Set 
    End Property 
    Public Shared Property MyString() As String 
     Get 
      Return Get2(Of String)() 
     End Get 
     Set 
      Set2(Of String)(value) 
     End Set 
    End Property 
End Class 

'======================================================= 
'Service provided by Telerik (www.telerik.com) 
'Conversion powered by NRefactory. 
'Twitter: @telerik 
'Facebook: facebook.com/telerik 
'======================================================= 
संबंधित मुद्दे

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