2009-08-11 27 views
6

मैं अब भी नियंत्रण में उलझन से अपरिचित हूं (हालांकि मैं अब इसके बारे में सीख रहा हूं) इसलिए यदि यह मेरे प्रश्न का समाधान है, तो बस मुझे बताएं और मुझे मिल जाएगा इसके बारे में सीखने के लिए वापस।एएसपी.नेट एमवीसी - कंट्रोलर के बीच सत्र राज्य साझा करना

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

आप क्या सुझाव देते हैं?

सटीक प्रसंग:

एक फाइल अपलोड पोस्ट देखें UploadController.ImageWithpreview() है, जो तब तैनात फ़ाइल और यह प्रतियां एक अस्थायी निर्देशिका में पढ़ता है के लिए एक फ़ाइल। फ़ाइल को सहेजने के बाद, एक और क्लास अपलोड की गई छवि का थंबनेल बनाता है। मूल फ़ाइल और जेनरेट किए गए थंबनेल दोनों के लिए पथ एक JsonResult के साथ एक जावास्क्रिप्ट कॉलबैक में लौटा दिया जाता है जो पृष्ठ पर किसी रूप में कुछ गतिशील सामग्री को अपडेट करता है जिसे "सहेजा" या "रद्द" किया जा सकता है। चाहे अपलोड की गई छवि सहेजी गई हो या इसे छोड़ दिया गया हो, मुझे अस्थायी निर्देशिका से या दोनों उत्पन्न और थंबनेल को हटाने या हटाने की आवश्यकता है। इसे सुविधाजनक बनाने के लिए, अपलोडकंट्रोलर सत्र-रखरखाव कतार ऑब्जेक्ट में सभी अपलोड फ़ाइलों और उनके थंबनेल का ट्रैक रखता है।

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

उत्तर

3

कुछ समाधान दिमाग में आते हैं।

internal class SessionState 
{ 
    string ImageName 
    { 
    get { return HttpContext.Current.Session["ImageName"]; } 
    set { HttpContext.Current.Session["ImageName"] = value; } 
    } 
} 
: आप एक "SessionState" वर्ग है कि अनुरोध में नक्शे और हो जाता है/सेट जैसे जानकारी (मैं स्मृति से कर रहा हूँ तो यह संकलन की संभावना नहीं है और बिंदु को व्यक्त करने के लिए है) इस्तेमाल कर सकते हैं

और फिर नियंत्रक से, की तरह कुछ कार्य करें: नियंत्रक से फिर

public static class SessionControllerExtensions 
{ 
    public static string GetImageName(this IController controller) 
    { 
    return HttpContext.Current.Session["ImageName"]; 
    } 

    public static string SetImageName(this IController controller, string imageName) 
    { 
    HttpContext.Current.Session["ImageName"] = imageName; 
    } 
} 

:

var sessionState = new SessionState(); 
    sessionState.ImageName = "xyz"; 
    /* Or */ 
    var imageName = sessionState.ImageName; 

वैकल्पिक रूप से, आप एक नियंत्रक विस्तार विधि बना सकते हैं

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

ध्यान रखें कि सत्र में जानकारी संग्रहीत करते समय, आपको क्रमिकरण के माध्यम से वस्तुओं को निर्जलीकरण/पुनर्निर्मित करना होगा और आपको ऐसा प्रदर्शन नहीं मिल रहा है जो आपको लगता है कि आप इसे इस तरह से करने से हैं।

उम्मीद है कि इससे मदद मिलती है।

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

1) उपयोगकर्ता एक छवि अपलोड करने की अनुमति दें। यह छवि एप्लिकेशन या कुछ सेवा द्वारा पृष्ठभूमि प्रसंस्करण के लिए प्रसंस्करण कतार में जाती है। इसके अतिरिक्त, छवि का नाम उपयोगकर्ता की व्यक्तिगत प्रसंस्करण कतार में जाता है - संभवतः डेटाबेस में एक तालिका। वेब ऐप में पृष्ठभूमि प्रसंस्करण के बारे में जानकारी @Schedule a job in hosted web server

2) इन छवियों को संसाधित करें और प्रसंस्करण करते समय, "प्रसंस्करण ग्राफिक" प्रदर्शित करें। आपके पास उत्पाद पृष्ठ पर AJAX अनुरोध हो सकता है जो छवियों को संसाधित करने की जांच करता है और उन्हें प्रत्येक X सेकंड को पुनः लोड करने का प्रयास करता है।

3) एक छवि "संसाधित" जा रही है, उपयोगकर्ता यह सोचते हैं कि वे एक है कि छवि अपलोड कर रहे हैं प्रसंस्करण से बाहर निकल सकते। यह या तो उत्पाद पृष्ठ (रों) छवि प्रदर्शित पर या एक अलग "उपयोगकर्ता कतार" का मानना ​​है कि उन्हें ध्यान से चित्र को निकालने के लिए अनुमति देगा पर उपलब्ध है।

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

छवियां/उत्पाद/{id} .jpg या, यदि कोई संग्रह, छवियां/उत्पाद/{id}/{sequence} .jpg।

फिर आप के रूप में गंतव्य पता करने की जरूरत नहीं है। यह सभी छवियों के लिए एक ही है।

कतार को तब पता होना चाहिए कि अस्थायी छवि अपलोड की गई थी और उत्पाद आईडी क्या थी। कतार कार्यकर्ता कतार से वस्तुओं को पॉप करता है, उन्हें संसाधित करता है, और तदनुसार उन्हें स्टोर करता है।

मुझे पता है कि यह मूल रूप से आपके इरादे से थोड़ा अधिक "संरचित" लगता है, लेकिन मुझे लगता है कि यह थोड़ा क्लीनर है।

+0

इस इनपुट को धन्यवाद। मैंने अपने मूल प्रश्न में कुछ और जानकारी जोड़ दी है यदि यह किसी और उपयोग का है। –

+0

छवि प्रसंस्करण वास्तविक समय है, लेकिन वेबसाइट के लिए एक व्यवस्थापक क्षेत्र के अंदर मौजूद है, इसलिए इसका समग्र उपयोग बहुत कम है। अधिकतर, पूरे एप्लिकेशन में प्रति घंटे केवल कुछ छवियों को संसाधित होने की संभावना है। एक और दृष्टिकोण जिसे मैंने भी माना था, केवल वर्तमान सत्र के लिए एप्लिकेशन की सत्र_एंड घटना पूरी अस्थायी निर्देशिका को हटा रहा था, लेकिन मुझे यकीन नहीं है कि यह कितना आदर्श है। –

+0

यदि आपके उपयोगकर्ता ने बहुत सी छवियां अपलोड की हैं जो प्रसंस्करण कर रही हैं, तो मुझे नहीं लगता कि आप गारंटी दे सकते हैं कि यह तब होगा जब उनका सत्र समाप्त हो जाएगा। एक बार "प्रसंस्करण" पूरा हो जाने पर मैं इसे हटा दूंगा। जब तक कतार में प्रक्रिया करने की प्रक्रिया होती है तब तक कार्यकर्ता थ्रेड जीवित रहना चाहिए ताकि इसे मानना ​​सुरक्षित हो। जब तक आपका ऐप पूल "सोया नहीं जाता", तब तक आपके सिस्टम को ठीक प्रक्रिया करना जारी रखना चाहिए। बहुत यकीन है कि यह मेरे द्वारा जुड़े आलेख में शामिल है। वास्तव में – andymeadows

1

क्या अपलोडकंट्रोलर और उत्पाद नियंत्रक के बीच पूर्ण समकक्ष है?

अपलोडकंट्रोलर द्वारा फ़ाइलों को अपलोड करने के रूप में, अपलोड के बारे में डेटा सत्र में संग्रहीत किया जाता है। ऐसा होने के बाद मुझे ProductController में उस सत्र डेटा तक पहुंचने की आवश्यकता है।

जैसा कि मैंने पढ़ा है कि अपलोडकंट्रोल को डेटा अपलोड करने के लिए पढ़ने और लिखने की आवश्यकता है, तो उत्पाद नियंत्रक को केवल पढ़ने की आवश्यकता है।

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

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

मुझे यहां कोई भी DRY उल्लंघन नहीं दिख रहा है, हम स्पष्ट रूप से जिम्मेदारियों को अलग करने की कोशिश कर रहे हैं।

+0

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

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