2009-05-27 18 views
7

मेरे पास एक ऐसा एप्लिकेशन है जो वेनिला एएसपी.नेट में लिखा गया था जिसे मैं एएसपी.नेट एमवीसी पर बंद करना चाहता हूं।एएसपी.नेट एमवीसी सत्र बनाम ग्लोबल बनाम कैश

हालांकि, मैं वस्तुओं को जारी रखने के लिए सही जगह के बारे में उलझन में हूं। मैं एक जोड़े कारणों के लिए लागू करने के लिए की जरूरत है:

  1. मैं सभी एक एकल डेटाबेस कनेक्शन, एक "भंडार" या "प्रबंधक" शैली वस्तु में लिपटे करना चाहते हैं।
  2. प्रत्येक उपयोगकर्ता के पास एक उपयोगकर्ता ऑब्जेक्ट होता है जिसे प्रति सत्र आधार पर सहेजने की आवश्यकता होती है।

आम तौर पर, मैं कहूँगा कि # 1 Globals.asax कि Global.Repository या इसी तरह का उपयोग कर मारा जा सकता है में एक स्थिर आइटम के रूप में बचा लिया जाएगा।

और मैं सामान्य रूप से कहूंगा कि # 2 पृष्ठों की बेस क्लास में सत्र बैकिंग स्टोर के साथ एक संपत्ति होनी चाहिए।

अब मुझे उलझन में आने का कारण यह है कि मैंने सुना है कि एमवीसी में सत्र बदल गए हैं, और ग्लोबल.एक्सएक्स अब एक ही कक्षा नहीं रखता है। साथ ही, पृष्ठों की अवधारणा को हटा दिया गया है, इसलिए नियंत्रक के बेस क्लास में एक संपत्ति जोड़ना गलत लगता है ... गलत।

yall क्या कहते हैं?

उत्तर

10

आपका डेटाबेस आपके नियंत्रकों के लिए बेस क्लास में जाएगा। इस बेस क्लास को नियंत्रक का विस्तार करना चाहिए, और आपके सभी नियंत्रकों को बेस क्लास का विस्तार करना चाहिए। यहां एक छोटा सा उदाहरण दिया गया है:

public class BaseController : Controller 
{ 
    private AuthServices _auth; 
    private LogHelper _log; 
    private Repository _repository; 

    /// <summary> 
    /// <see cref="AuthServices"/> 
    /// </summary> 
    protected AuthServices Authorization 
    { 
     get { return _auth ?? (_auth = new AuthServices()); } 
    } 

    /// <summary> 
    /// <see cref="LogHelper"/> 
    /// </summary> 
    protected LogHelper Log 
    { 
     get { return _log ?? (_log = new LogHelper()); } 
    } 

    /// <summary> 
    /// <see cref="Repository"/> 
    /// </summary> 
    protected Repository Repository 
    { 
     get { return _repository ?? (_repository = new Repository()); } 
    } 
} 

आलसी तत्कालता पर ध्यान दें। इससे मुझे परीक्षण चलाने से पहले चुपके और मोज़े के साथ अपने निजी खेतों को सेट करने की अनुमति मिलती है।

सत्र के लिए, आपका उपयोगकर्ता ऑब्जेक्ट अभी भी पारंपरिक एएसपी.NET एप्लिकेशन के सत्र में सहेजा जा सकता है। लगभग सबकुछ अभी भी आसपास है (प्रतिक्रिया, कैश, सत्र, आदि), लेकिन उनमें से कुछ को System.Web.Abstractions से कक्षाओं के साथ लपेटा गया है ताकि उन्हें परीक्षण के लिए मजाक किया जा सके। वे सभी अभी भी वैसे ही व्यवहार करते हैं, हालांकि आपको उनमें से कुछ को अपनी पारंपरिक भूमिका में उपयोग नहीं करना चाहिए (उदाहरण के लिए, प्रतिक्रिया नहीं दें। रीडायरेक्ट, एक एक्शन रीसेट जैसे कि रीडायरेक्ट टॉउटआउट रीसेट जो आपकी रीडायरेक्शन करता है)।

अपने प्रश्नों के पीछे तर्क का सवाल है ....

एक एकल डाटाबेस कनेक्शन पर नहीं तनाव मत करो। आपके कार्यान्वयन के आधार पर यह एक बुरा विचार भी हो सकता है, क्योंकि अनुरोध एक-दूसरे पर कदम उठा सकते हैं। बस अपना कनेक्शन खोलें, इसका इस्तेमाल करें, और किए जाने पर इसे बंद/बंद करें।

इसके अलावा, एमवीसी लाए जाने वाले सबसे बड़े बदलावों में से एक राज्य के मॉडल को अस्वीकार कर रहा है कि परंपरागत एएसपी.नेट ने वेब विकास लाने का प्रयास किया। वह ढांचा और व्यूस्टेट अब मौजूद नहीं है (पर्दे के पीछे आदमी को ध्यान न दें)। जितना कम राज्य आप कम जटिल और अधिक मजबूत वेब अनुप्रयोग पर रखते हैं। इसे आज़माएं, आपको यह पसंद आएगा।

+1

"आलसी तत्कालता पर ध्यान दें। इससे मुझे परीक्षण चलाने से पहले चुपके और मेरे निजी क्षेत्रों को मोजे के साथ सेट करने की अनुमति मिलती है।" आईओसी का उपयोग क्यों नहीं करें? –

+1

बेबी कदम ...... आपको ऐसा करने के उदाहरण के साथ जवाब देना चाहिए। – Will

+1

मैं वास्तव में कनेक्शन पूलिंग का उपयोग करता हूं। वैसे भी, धन्यवाद। यह लगभग वही है जो मैं योजना बना रहा था, जानना अच्छा है कि मैं सर्वोत्तम अभ्यास के काफी करीब आ रहा हूं। –

2

सत्र एमवीसी में बिल्कुल नहीं बदला है। Global.asax में ग्लोबल ऐप्लिकेशंस क्लास अभी भी मौजूद है। पेज भी मौजूद हैं, कि आप किसी पृष्ठ के बजाय नियंत्रक में एक संग्रह को संदर्भित करना चाहते हैं। एक बेस नियंत्रक वर्ग में एक संपत्ति जोड़ना ठीक है; मुझे हर व़क्त यह करना है।

4

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

public static class SessionHandler 
{ 
    // User Values 
    private static string _userID = "UserID"; 
    private static string _userRole = "UserRole"; 

    public static string UserID 
    { 
     get 
     { 
      if (HttpContext.Current.Session[SessionHandler._userID] == null) 
      { return string.Empty; } 
      else 
      { return HttpContext.Current.Session[SessionHandler._userID].ToString(); } 
     } 
     set 
     { HttpContext.Current.Session[SessionHandler._userID] = value; } 

    } 

    public static string UserRole 
    { 
     get 
     { 
      if (HttpContext.Current.Session[SessionHandler._userRole] == null) 
      { return string.Empty; } 
      else 
      { return HttpContext.Current.Session[SessionHandler._userRole].ToString(); } 
     } 
     set 
     { HttpContext.Current.Session[SessionHandler._userRole] = value; } 

    } 
} 
+0

मुझे यह पसंद है, लेकिन प्रत्येक नियंत्रक के लिए एक उदाहरण बनाया जाना होगा। मैं सत्र नियंत्रक सत्र-आधारित वस्तुओं में सभी नियंत्रकों के बजाय, इसलिए मैं उन्हें बेसकंट्रोलर कक्षा में गुणों के रूप में रखने जा रहा हूं। –

1

आप राज्य को समाहित करने के लिए एक मॉडल बांधने की मशीन बना सकते हैं।

मॉडल बांधने की मशीन के साथ

(उसकी खरीदारी की टोकरी कार्यान्वयन पर स्टीव सैंडरसन के MVC पुस्तक देखें), तो आपको controllerContext की पहुंच है - जो HttpContext है।

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