2010-10-22 5 views
5

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

इसका मतलब है कि मुझे समय गुणों को सही उपयोगकर्ता टाइमज़ोन में दोबारा बदलने की आवश्यकता है। पुनरावृत्ति हमेशा खराब कोड या बेहतर तरीका का संकेत है, इसलिए मैं लागू करने के लिए सर्वोत्तम रणनीति तैयार करने की कोशिश कर रहा था। यद्यपि यह प्रभावशाली प्रस्तुति तर्क है, लेकिन मेरे विचार अलग-अलग हैं क्योंकि ऐसा लगता है कि मॉडल को वर्तमान उपयोगकर्ता के लिए सही मान जानना चाहिए। अब तक मेरे विचार कर रहे हैं:

  1. एक स्थिर सहायक वर्ग का उपयोग करें और फिर इसे हर बार मॉडल की संपत्ति प्रयोग किया जाता है कहते हैं। ऐसा लगता है कि त्रुटि या प्रकोप हो रहा है और गणना और गणना बोझिल है।

  2. मॉडल ऑब्जेक्ट को व्यूमोडेल ऑब्जेक्ट में लपेटें। यह वस्तुओं की सूचियों से निपटने के दौरान विशेष रूप से बोझिल है।

  3. मॉडल के लिए एक विस्तार विधि लिखें जो केवल प्रस्तुति परत में मौजूद है। यह क्लीनर लेकिन अनजान लगता है।

  4. रूपांतरण के लिए मॉडल परत में एक इंटरफ़ेस बनाएं। प्रस्तुति परत में सहायक को कार्यान्वित करें और मॉडल परत को कार्यान्वयन दें। मॉडल में तब गुण होते हैं जो समय को बदलने के लिए इंटरफ़ेस का उपयोग करते हैं। ऐसा लगता है कि यह चिंताओं को अलग करना तोड़ना चाहिए लेकिन ऐसा नहीं लगता है। यदि आपके पास एक डिफ़ॉल्ट कनवर्टर था तो आपको शून्य ऑब्जेक्ट अपवाद प्राप्त करने की चिंता करने की आवश्यकता नहीं होगी, फिर मॉडल परत (वर्तमान में पीओसीओ) को रूपांतरण सहायक के लिए एक कंटेनर की आवश्यकता होगी जो गन्दा लगता है।

  5. मॉडल पर स्थानीय टाइमज़ोन विधि में कनवर्ट करें और वर्तमान टाइमज़ोन में पास करें।

मुझे इन रणनीतियों या किसी अन्य पर विचारों में दिलचस्पी है जो मुझे इन जगहों पर उपयोग करना चाहिए या नहीं।

अद्यतन मैं वर्तमान में क्या किया है एक ITimeConvertor और मॉडल परत के भीतर एक ITimeConvertorFactory तैयार करना है। इसके बाद मैंने इनके डिफ़ॉल्ट कार्यान्वयन किए हैं जो मूल तारीख मान वापस कर देते हैं। मॉडल परत के भीतर मैंने मूल रूप से मॉडल पर मौजूद प्रत्येक मौजूदा यूटीसी संपत्ति के लिए लोकलटाइम गुण जोड़े हैं। इन गुणों के भीतर मैं एक कनवर्टर प्राप्त करने के लिए कारखाने का उपयोग करता हूं और गेटटर और सेटर में यूटीसी मूल्य को हर तरह परिवर्तित करता हूं। मुझे वर्तमान टाइमकॉन्टर फैक्ट्री को स्टोर करने के लिए एक मॉडल के रूप में मॉडल परत (जिसे मैं वास्तव में पसंद नहीं करता) में एक स्थिर सेटिंग क्लास जोड़ना पड़ा। वेब ऐप भाग के भीतर मैं ITimeConvertorFactory और ITimeConvertor को WebTimeConvertorFactory और WebTimeConvertor के रूप में कार्यान्वित करता हूं। WebTimeConvertor सत्र और वर्तमान उपयोगकर्ता के बारे में जानता है ताकि वर्तमान टाइमज़ोन को पकड़ सकें। WebTimeConvertorFactory WebTimeConvertors बनाता है। जब एप्लिकेशन शुरू होता है (global.asax में application_onstart) मैं फैक्ट्री बनाता हूं और मॉडल परत स्थिर सेटिंग्स गुण को पास करता हूं। यह मेरी मॉडल परत स्थानीय समय को बदलने में सक्षम होने की अनुमति देता है जबकि डेटा परत केवल यूटीसी दिनांक गुणों के बारे में जानता है। इसका मतलब यह भी है कि मैं सीधे मॉडल में लोकटाइम पास कर सकता हूं और इसे सटीक रूप से परिवर्तित कर सकता हूं बशर्ते कि उपभोग करने वाले ऐप ने कनवर्टर फैक्ट्री प्रदान की हो। चूंकि यूटीसी गुण अपरिवर्तित हैं, फिर भी वे ऐप के भीतर कहीं भी इस्तेमाल किए जा सकते हैं। हालांकि यह बहुत सारे कोड की तरह लग रहा था, मुझे यह समाधान एक बार लागू होने के बाद काफी साफ पाया गया है क्योंकि यह सेवा के अन्य उपभोक्ताओं को अपने समय रूपांतरण को लागू करने की इजाजत देता है, वैसे भी वे चाहते हैं (अगर बिल्कुल) मॉडल गुणों की खपत को बनाए रखते हुए उचित रूप से स्पष्ट है।

मैं अभी भी अपने मौजूदा समाधान के बेहतर समाधान और आलोचना के लिए खुला हूं।

उत्तर

2

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

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

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

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

+0

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

+0

मैंने अपना जवाब अपडेट कर दिया है। – henginy

+0

उत्कृष्ट, धन्यवाद। मैं देख रहा हूं कि आप क्या कह रहे हैं और मेरे लिए यह वास्तव में दो 'आवश्यक बुराइयों' के बीच टॉस अप है। जैसा कि मुझे खपत की सादगी पसंद है (और चूंकि मैं वर्तमान में केवल एक ही काम कर रहा हूं), मैं समय के लिए अपने रास्ते से चिपके रहूंगा लेकिन मुझे लगता है कि आपका समान रूप से मान्य है और निश्चित रूप से अधिक पारदर्शी/पठनीय है। – toxaq

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