2009-04-01 13 views
17

के लिए एएसपी.NET सत्र का उपयोग करना मैं एक कस्टम उपयोगकर्ता वर्ग उदाहरण के जीवनकाल को प्रबंधित करने के लिए एकता का उपयोग करने पर विचार कर रहा हूं। मैं एक कस्टम एएसपी.NET सत्र प्रबंधक के साथ लाइफटाइम मैनेजर को विस्तारित करने की योजना बना रहा हूं। मैं जो करने में सक्षम होना चाहता हूं वह है कि वर्तमान में मेरे कस्टम वर्गों से लॉग इन उपयोगकर्ता ऑब्जेक्ट को स्टोर और पुनर्प्राप्त करें, और एकता को एएसपी.नेट में सत्र ऑब्जेक्ट से उपयोगकर्ता का उदाहरण प्राप्त करें, या (जब Win32 प्रोजेक्ट में) इसे पुनर्प्राप्त करें स्थिर या वर्तमान धागे से।लाइफटाइम मैनेजमेंट (एकता)

अब तक मेरा सबसे अच्छा समाधान स्टार्टअप पर मेरे एकता कंटेनर का एक स्थिर उदाहरण बनाना है, और मेरे उपयोगकर्ता ऑब्जेक्ट को मेरी प्रत्येक कक्षा से प्राप्त करने के लिए समाधान विधि का उपयोग करना है। हालांकि, ऐसा लगता है कि यह मेरे अन्य वर्गों में एकता कंटेनर पर निर्भरता पैदा करता है। इस लक्ष्य को पूरा करने के लिए "एकता" तरीका क्या है? मैं किसी भी वर्ग से वर्तमान उपयोगकर्ता उदाहरण को पढ़ने/बदलने में सक्षम होना चाहता हूं।

+0

"कस्टम एएसपी.नेट सत्र प्रबंधक" का क्या मतलब है? क्या आप एनएचबीर्नेट सत्र या डेटा/ऑब्जेक्ट कॉन्टेक्स्ट के बारे में बात कर रहे हैं? –

उत्तर

0

मुझे लगता है कि आपको एकता के माध्यम से दो सेवाओं की आवश्यकता है (या एक सेवा जो दोनों कार्य करता है)।

उपयोगकर्ता ऑब्जेक्ट को संग्रहीत करने के बजाय, एक इंटरफ़ेस कार्यान्वयन संग्रहीत करें जो एक विधि/संपत्ति का खुलासा करता है जो आपके लिए उपयोगकर्ता ऑब्जेक्ट प्राप्त करेगा। एएसपी.नेट मामले में, आप सत्र से उपयोगकर्ता को पुनर्प्राप्त करते हैं। WinForm समाधान (या जो कुछ भी) में, आप इसे निष्पादन धागे से प्राप्त कर सकते हैं।

आपके पास एक सेट विधि/संपत्ति भी होगी, जिसका उपयोग आप उपयोगकर्ता को सेट करने के लिए करेंगे।

+0

क्या आप एक स्यूडोकोड उदाहरण प्रदान कर सकते हैं? मुझे समझ में नहीं आता कि आपकी प्रतिक्रिया यूनिटी का उपयोग कैसे करती है, या यह कैसे एक वर्ग को उपयोगकर्ता को एएसपी.NET या WinForm में उपयोग किया जा रहा है, यह जानने के बिना उपयोगकर्ता को पुनर्प्राप्त करने की अनुमति देता है। –

2

क्यों कैश वस्तु का उपयोग नहीं के बजाय ... तो आप यह दोनों जीत और वेब से उपयोग कर सकते हैं। इस तरह:

IUnityContainer container= HttpRuntime.Cache.Get("Unity") as IUnityContainer; 

    if (container == null) 
    { 
     container= // init container 

     HttpRuntime.Cache.Add("Unity", 
      container, 
      null, 
      Cache.NoAbsoluteExpiration, 
      Cache.NoSlidingExpiration, 
      CacheItemPriority.NotRemovable, 
      null); 
    } 

    // return container or something 

HttpRuntime.Cache दोनों जीत और वेब में

-5

मेरे क्षमायाचना काम करेंगे अगर यह नहीं बिल्कुल सही है, लेकिन ...

एकता एक खेल देव मंच है, इसलिए मैं मान लें कि आप एक 3 डी ऐप या गेम बना रहे हैं जिसके साथ आप कुछ अच्छा करने का इरादा रखते हैं (उदाहरण के लिए इसे मल्टीप्लेयर/ट्रैक सर्वर को सर्वर का उपयोग करके प्रगति करें)।

प्रत्येक उपयोगकर्ता लॉगिन क्यों नहीं है, तो आप उपयोगकर्ता आईडी/नाम पर acces प्राप्त करने के लिए सदस्यता प्रदाता और फॉर्मस प्रमाणीकरण कक्षाओं का उपयोग कर सकते हैं।

अपने सर्वर पर आप बस उस जानकारी को लिंक करते हैं जो उपयोगकर्ता को आसानी से वापस खींचने की अनुमति देता है (सरल AJAX/सामान्य http अनुरोध) स्थिति/उपयोगकर्ता अनुरोध से प्रासंगिक डेटा।

मुझे यह सुनिश्चित करने के लिए नहीं पता है, लेकिन मुझे विश्वास है कि एकता कुछ ऐसा है जो क्लाइंट पक्ष को तैनात करता है इसलिए सर्वर पर इसके साथ कोई एकीकरण नहीं किया जाना चाहिए।

बस अनुरोध करें कि आपको क्या चाहिए और ग्राहक पक्ष पर इसे संसाधित करें।

इस तरह आप क्लासिक एन-स्तरीय डिज़ाइन पैटर्न से चिपके रहते हैं जो आपको अपने डेटा को अपने डेटा स्टोरेज और ui से अलग करने की अनुमति देता है।

आशा इस मदद करता है ...

+0

क्षमा करें, लेकिन आपका उत्तर एक बहुत ही संक्षिप्त प्रश्न का समाधान प्रदान करने के बजाय बस एक पूरी तरह से अलग पथ पर इंगित करता है। – JCallico

+2

गलत एकता, http://unity.codeplex.com/ देखें। यह निर्भरता इंजेक्शन लाइब्रेरी है। – marijne

13

आप जब सादे पुराने ASP.Net परियोजना ASP.Net MVC के बजाय के साथ प्रयोग किया एकता के साथ सबसे अच्छा फ़ायदा उठा रहे हैं चाहते हैं। एएसपी.NET एमवीसी आपको उपयोगकर्ता वस्तुओं, नियंत्रकों, मॉडल इत्यादि को प्रबंधित करने के लिए एकता जैसे कंटेनर का उपयोग करने की अनुमति देता है। यदि संभव हो, तो एएसपी के बजाय एमवीसी का उपयोग करें।अपनी परियोजनाओं के लिए नेट वेब फॉर्म।

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

public class SessionLifetimeManager : LifetimeManager 
{ 
    private string _key = Guid.NewGuid().ToString(); 

    public override object GetValue() 
    { 
      return HttpContext.Current.Session[_key]; 
    } 

    public override void SetValue(object value) 
    { 
      HttpContext.Current.Session[_key] = value; 
    } 

    public override void RemoveValue() 
    { 
      HttpContext.Current.Session.Remove(_key); 
    } 
} 

तुम भी PerWebRequest जीवन प्रबंधन के लिए इसी तरह की एक लिख सकते हैं।

+1

जहां तक ​​मुझे पता है, ढांचे द्वारा विधि को कभी भी नहीं कहा जाता है। यह कोडर द्वारा उपयोग के लिए है। फ्रेमवर्क अनुबंध को परिभाषित क्यों करता है और अनुबंध में किसी भी तरीके का उपयोग नहीं करता है? यह मुझे पागल ड्राइव करता है। – Zasz

0

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

PostSharp एक उत्कृष्ट एओपी ढांचा IMHO है।

अंत में आपका ऐप एओपी ढांचे पर निर्भर होगा, लेकिन आपके पर्यावरण के आधार पर पूरी तरह से डीकॉप्लेड एप्लिकेशन अवास्तविक हो सकता है। आप आश्चर्यचकित हो सकते हैं कि एओपी और आईओसी का संयोजन कितना उपयोगी हो सकता है।

0

यदि "कस्टम एएसपी.नेट सत्र प्रबंधक" द्वारा आप एनएचबीरनेट सत्र या डेटा/ऑब्जेक्ट कॉन्टेक्स्ट के बारे में बात कर रहे हैं, तो ऐसा लगता है कि आपको जो चाहिए वह एक IUserRepository है जो कि कन्स्ट्रक्टर या प्रॉपर्टी सेटर में इंजेक्शन दिया गया है जिससे आप पुनर्प्राप्त कर सकते हैं उपयोगकर्ता वस्तु। IUserRepository का कार्यान्वयन बैकएंड कैश आदि में डेटाबेस पहुंच से कुछ भी हो सकता है। यदि आप सीधे कंटेनर पर Resesve() का उपयोग कर रहे हैं, तो आप Service Locator पैटर्न का पालन कर रहे हैं और जो कुछ भी प्रदान कर सकते हैं उसके लिए एकता का सही ढंग से उपयोग नहीं कर रहे हैं।

आप रिपोजिटरी के जीवनकाल को प्रबंधित करने के लिए Ravi's answer का उपयोग कर सकते हैं।

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