मैं आमतौर पर इसे सत्र कुंजी के लिए उपयोग करता हूं और फिर स्पष्ट रूप से आवश्यक वस्तुओं को जोड़ता हूं। इसका कारण यह है कि यह करने का एक साफ तरीका है और मुझे लगता है कि आप सत्र में वस्तुओं की संख्या को न्यूनतम रखना चाहते हैं।
यह विशेष दृष्टिकोण एक साथ फॉर्म प्रमाणीकरण और उपयोगकर्ता सत्र को एक साथ लाता है ताकि आप वस्तुओं को जोड़ सकें और इसके बारे में भूल सकें। तर्क दिया जा सकता है कि यह एक बड़ा वर्बोज़ है, लेकिन यह किसी भी डबल अप को रोकता है और आपके पास सत्र में बहुत अधिक वस्तुएं नहीं होनी चाहिए।
निम्नलिखित कोर लाइब्रेरी या जहां भी आप चाहते हैं में निम्नलिखित मौजूद हो सकते हैं।
public class CurrentSession : MySession<PublicUser>
{
public static CurrentSession Instance = new CurrentSession();
protected override PublicUser LoadCurrentUser(string username)
{
// This would be a data logic call to load a user's detail from the database
return new PublicUser(username);
}
// Put additional session objects here
public const string SESSIONOBJECT1 = "CurrentObject1";
public const string SESSIONOBJECT2 = "CurrentObject2";
public Object1 CurrentObject1
{
get
{
if (Session[SESSIONOBJECT1] == null)
Session[SESSIONOBJECT1] = new Object1();
return Session[SESSIONOBJECT1] as Object1;
}
set
{
Session[SESSIONOBJECT1] = value;
}
}
public Object2 CurrentObject2
{
get
{
if (Session[SESSIONOBJECT2] == null)
Session[SESSIONOBJECT2] = new Object2();
return Session[SESSIONOBJECT2] as Object2;
}
set
{
Session[SESSIONOBJECT2] = value;
}
}
}
अंत स्पष्ट रूप से घोषित करने के बड़ा लाभ:
/// <summary>
/// Provides a default pattern to access the current user in the session, identified
/// by forms authentication.
/// </summary>
public abstract class MySession<T> where T : class
{
public const string USERSESSIONKEY = "CurrentUser";
/// <summary>
/// Gets the object associated with the CurrentUser from the session.
/// </summary>
public T CurrentUser
{
get
{
if (HttpContext.Current.Request.IsAuthenticated)
{
if (HttpContext.Current.Session[USERSESSIONKEY] == null)
{
HttpContext.Current.Session[USERSESSIONKEY] = LoadCurrentUser(HttpContext.Current.User.Identity.Name);
}
return HttpContext.Current.Session[USERSESSIONKEY] as T;
}
else
{
return null;
}
}
}
public void LogOutCurrentUser()
{
HttpContext.Current.Session[USERSESSIONKEY] = null;
FormsAuthentication.SignOut();
}
/// <summary>
/// Implement this method to load the user object identified by username.
/// </summary>
/// <param name="username">The username of the object to retrieve.</param>
/// <returns>The user object associated with the username 'username'.</returns>
protected abstract T LoadCurrentUser(string username);
}
}
तो निम्न वर्ग अपनी परियोजना की जड़ तक namespaced में यह लागू (मैं आमतौर पर MVC परियोजनाओं पर एक कोड फ़ोल्डर में रख दें) सत्र में आप जो चाहते हैं वह यह है कि आप विचारों सहित अपने एमवीसी आवेदन में इसे कहीं भी संदर्भित कर सकते हैं। बस के साथ इसे संदर्भ:
CurrentSession.Instance.Object1
CurrentSession.Instance.CurrentUser
फिर अन्य तरीकों से थोड़ा कम सामान्य, लेकिन वास्तव में वास्तव में स्पष्ट क्या हो रहा है, कोई अन्य हेराफेरी या dependancy इंजेक्शन और 100% अनुरोध संदर्भ के लिए सुरक्षित।
एक और नोट पर, डिकोनरी दृष्टिकोण शांत हैं, लेकिन आप अभी भी सामान के संदर्भ में सभी जगहों पर तारों के साथ समाप्त हो जाते हैं। आप इसे enums या कुछ के साथ छेड़छाड़ कर सकते हैं, लेकिन मैं मजबूत टाइपिंग पसंद करते हैं और उपर्युक्त दृष्टिकोण को सेट और भूल जाते हैं।
यदि आप एक ही प्रकार को एक से अधिक नियंत्रक को पास करते हैं तो क्या होगा? एक सत्र दूसरे को ओवरराइट करेगा? –
नहीं, वे दोनों एक ही प्रकार का नाम, और इस प्रकार एक ही सत्र कुंजी होगा। सत्र ऑब्जेक्ट्स को प्रतिस्थापित नहीं किया जाएगा, वे दोनों नियंत्रकों में एक ही ऑब्जेक्ट होंगे। –
नीचे जोड़ा गया उत्तर बेस नियंत्रकों की आवश्यकता नहीं है और यह भी दृश्य कोड में सत्र तक पहुंच सकते हैं। – Gats