2009-07-22 13 views
13

मैं एक ऐसा एप्लिकेशन बना रहा हूं जो कॉनरी के एमवीसी स्टोरफ्रंट के प्रारंभिक संस्करणों के समान शीर्ष पर एक सेवा परत के साथ भंडार पैटर्न का मोटे तौर पर पालन करता है।सेवा परत को HttpContext तक पहुंच प्राप्त करनी चाहिए?

मुझे एक ऐसे पृष्ठ को लागू करने की आवश्यकता है जो वर्तमान उपयोगकर्ता को छोड़कर सभी उपयोगकर्ताओं को लौटाए। मेरे पास पहले से ही रिपोजिटरी और सर्विस परतों पर GetUsers() विधियां हैं, इसलिए सवाल यह है कि "वर्तमान उपयोगकर्ता को छोड़कर" लागू करना है।

क्या सेवा परत को HttpContext से अवगत होना चाहिए, इस प्रकार इस नियम को लागू करना चाहिए? मैं वर्तमान उपयोगकर्ता (आईडी) को नियंत्रक से इस सेवा विधि में पास करने का लुत्फ उठा रहा हूं, लेकिन अगर सेवा परत HttpContext- जागरूक थी और यह स्वयं ही कर सकती है तो यह क्लीनर लगता है।

एक स्पष्ट विकल्प नियंत्रक के भीतर सीधे इस नियम को लागू करने के लिए है, लेकिन मैं सिर्फ इतना है कि इस विचार पर गर्म नहीं कर रहा हूँ ...


संपादित - बस जवाब पर टिप्पणी करने से: मैं समस्या दिखाई देती है रिवर्स निर्भरता समस्या के साथ, कुछ जो मैं पूरी तरह से अनदेखा कर रहा था। मैं मेहरदाद को उत्तर देय वोट के रूप में चिह्नित कर रहा हूं, लेकिन हर किसी ने वास्तव में पढ़ने के लायक मूल्यवान प्रतिक्रिया प्रदान की है!

उत्तर

18

बिलकुल नहीं। इस तरह की चीजों को डिजाइन करने में मेरी मानसिकता इस तरह है: मुझे लगता है कि मुझे वेब एप्लिकेशन के साथ एक विंडोज आधारित ऐप लिखने की जरूरत है और वेब विशिष्ट सामग्री पर निर्भरता को कम करने की कोशिश करें। पासिंग HttpContext सीधे आपकी सेवा परत की अपनी वेब UI परत पर युग्मन बढ़ाएगी जो आदर्श नहीं है।

4

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

2

मुझे कस्टम ऐपकॉन्टेक्स्ट क्लास बनाने के लिए यह अच्छा अभ्यास मिलता है जिसमें मेरा वर्तमान उपयोगकर्ता ऑब्जेक्ट (साथ ही साथ अन्य प्रासंगिक डेटा) भी शामिल है। इस वर्ग में System.Web का कोई संदर्भ नहीं है। संदर्भ सेवा के लिए आवश्यक किसी भी सेवा विधियों में एक AppContext पैरामीटर होना चाहिए (उदा। सुरक्षा अधिकारों की जांच के लिए, या वर्तमान उपयोगकर्ता को आपके मामले में प्राप्त करना)। इस ऑब्जेक्ट को वेब-स्तरीय में पॉप्युलेट करें और इसे सत्र में रखें यदि आपको आवश्यकता हो। इस तरह आपकी सेवा परत System.Web के बारे में कुछ भी नहीं जानता है।

+0

बस उपयोगकर्ता आईडी पास करने में क्या गलत है? –

+0

इसके साथ कुछ भी गलत नहीं है, मैं बस इसी तरह के सभी संदर्भ-जागरूक परिस्थितियों का इलाज करना पसंद करता हूं। – JonoW

+0

मुझे यह विचार पसंद है, जोनो! मैं अभी आईडी को पास कर सकता हूं, अगर/जब मेरी सेवा विधियां पैराम और ओवरलोड के साथ बदसूरत हो रही हैं तो यह बहुत अच्छा होगा। सेवा ऑब्जेक्ट को तुरंत चालू करते समय मैं ऐपकॉन्टेक्स्ट पास भी कर सकता था, इस प्रकार सेवा को कुछ हद तक "जागरूक" करने की इच्छा पूरी कर रहा था लेकिन सिस्टम.Web पर निर्भर नहीं था। –

9

उत्तर है, कोई

न केवल सेवा परत की वर्तमान प्रस्तुति परत पर निर्भरता होनी चाहिए, मेरी राय में वर्तमान आवेदन पर इसकी कोई निर्भरता नहीं होनी चाहिए। उदाहरण के लिए, मैं सुझाए गए here के रूप में कस्टम AppContext कक्षा का उपयोग नहीं करता।

इसके बजाय, GetAllUsersExceptForTheCurrentUser method.That तरह से करने के लिए एक पैरामीटर के रूप वर्तमान उपयोगकर्ता गुजरती हैं, सेवा है कि उपयोगकर्ताओं को न केवल वर्तमान आवेदन पर कार्रवाई करने की जरूरत है किसी भी आवेदन के द्वारा प्रयोग किया जा सकता है।

+0

सहमत हुए। विशेष रूप से, आप एक सेवा परत पर * संदर्भ * और * राज्य * जोड़ने के लिए स्वयं को धन्यवाद देंगे, जिस क्षण आपको लोड बैलेंसर के पीछे रखना होगा। –

+0

धन्यवाद, जॉन, यह एक महान बिंदु है। जोनोव के सुझाव पर मेरी अंतर्दृष्टि प्रतिक्रिया पर पुनर्विचार करता है। –

+0

मुझे लगता है कि आप क्या कह रहे हैं, लेकिन जब मैं कहता हूं कि एक सेवा विधि को संदर्भ-जागरूक होने की आवश्यकता है, तो मेरा मतलब है कि एक सेवा विधि है जिसे यह जानने की जरूरत है कि इसे कौन कॉल कर रहा है। उदाहरण के लिए, आप लोग प्राधिकरण कैसे संभालते हैं? यानी यह निर्धारित करना कि विधि कॉलर को विधि कॉल करने की अनुमति है या नहीं? मैं इस क्षेत्र में एक नौसिखिया हूं, इसलिए यह सुनकर उत्सुक है कि दूसरों ने यह कैसे किया/सर्वोत्तम प्रथाएं क्या हैं। चीयर्स – JonoW

1

नहीं। ऐसा करने से आपका कोड परीक्षण और पुन: उपयोग करने के लिए कठिन हो जाएगा।

मैं इस तरह की चीज़ के लिए एक बुनियादी ढांचा इंटरफ़ेस बनाना चाहता हूं (इसे IA प्रमाणीकरण या कुछ कहें) और उस पर एक CurrentUser प्रॉपर्टी का पर्दाफाश करें। तो मैं इसे अपने कन्स्ट्रक्टर के माध्यम से अपनी सेवा में इंजेक्ट करता हूं। यानी सार्वजनिक MyService (IA प्रमाणीकरण auth)

अंततः आप IA प्रमाणीकरण (वेब ​​प्रमाणीकरण कहें) के एक HttpContext जागरूक कार्यान्वयन का निर्माण कर सकते हैं।

अब जब आप अपने सेवा बनाने आप के रूप में अच्छी तरह से अपनी निर्भरता बनाने के लिए:

var myService = new MyService(new WebAuthentication()); 
var otherUsers = myService.GetAllOtherUsers(); 

आप एक आईओसी कंटेनर का उपयोग कर रहे हैं, तो बदसूरत निर्भरता भी दूर जाना कर सकते हैं!

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