दिलचस्प पोस्ट
जावा में ताज़ा करें जावा और .NET स्ट्रिंग literals कहाँ रहते हैं? मैं कार्टेसीयन उत्पाद को कमजोर कैसे गणना कर सकता हूं? बैच / ढूंढें और संपादित करें लाइनों को TXT फ़ाइल में पावरशेफ जेनेरिक संग्रह कैसे जुड़ें (मर्ज) डेटा फ़्रेम (आंतरिक, बाहरी, बाएं, दाएं)? Value <br का प्रकार java.lang.String को Android पर JSONObject में परिवर्तित नहीं किया जा सकता कीस्टोर प्रमाण पत्र के SHA-1 फिंगरप्रिंट एंड्रॉइड में स्पिनर को मैं कैसे आइटम जोड़ सकता हूं? गैर स्थैतिक सदस्य आरंभकर्ताओं के साथ कक्षाओं के लिए सी + + 11 समग्र प्रारंभ कॉलम प्रकार सेट करने के लिए सभी ईएफ मॉडल में सभी गुणों के माध्यम से लूप / प्रतिबिंबित करें क्या आईआईएफ फ़ंक्शन SSRS में दोनों रास्ते की गणना करता है या क्या यह कम-सर्किट है? तर्कों को अग्रेषित करने के लिए std :: forward का उपयोग कब करना है? iphone: जहां .dsym फ़ाइल क्रैश रिपोर्ट में स्थित है MySQL CONVERT_TZ ()

Servicestack – वास्तुकला और सब कुछ के लिए POCOs reusing

मैं पीओसीओ के सर्विस स्टैक प्रलेखन रेग उपयोग का उल्लेख करता हूं:

चूंकि यह स्वच्छ, पुन: उपयोग करने योग्य कोड को बढ़ावा देता है, सर्विसस्टैक्स ने हमेशा कोड के उपयोग को प्रोत्साहित किया है, जो कि पहले सब कुछ के लिए है।

यानी उसी पीओसीओ का इस्तेमाल किया जा सकता है:
अनुरोध और उत्तर में डीटीओ (ग्राहक और सर्वर पर)
जेएसओएन, जेएसवी और सीएसवी टेक्स्ट सीरियलाइजर्स में
ऑरमिलाइट, डीबी 4 ओ और एनआईबीनेट में डेटा मॉडल के रूप में
के रूप में संस्थाओं को Redis में संग्रहीत
जैसे कि कैब्स और सत्रों में संग्रहित ब्लॉब्स
गिरा और MQ सेवाओं में निष्पादित "

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

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

Solutions Collecting From Web of "Servicestack – वास्तुकला और सब कुछ के लिए POCOs reusing"

सॉफ्टवेयर का सबसे बड़ा दुश्मन

सबसे पहले मैं यह पुनरावृति करना चाहता हूं कि जटिलता और बड़े कोड के आधार सॉफ्टवेयर विकास का सबसे बड़ा दुश्मन है, और यह कि परियोजना की आवश्यकताओं को पूरा करने के साथ-साथ जटिलता को प्रबंधित करने और न्यूनतम और कम घर्षण बनाए रखने के क्रम में, evolvable code- आधार हमारे दिमाग में सबसे आगे होना चाहिए क्योंकि हम लगातार नए सॉफ्टवेयर और आवश्यकताओं के साथ हमारे सॉफ्टवेयर को बढ़ा रहे हैं। किसी भी दिशानिर्देश, नियम या प्रक्रिया जो हम सॉफ़्टवेयर की गुणवत्ता बढ़ाने के लिए जोड़ते हैं, उसकी आवश्यक जटिलता को प्रबंधित करने पर सीधे ध्यान केंद्रित किया जाना चाहिए। जटिलता को कम करने के लिए हम सबसे अच्छी चीजों में से एक कोड-बेस आकार को कम करना है, यानी ड्रिलिंग दोहराए जाने योग्य कोड और किसी भी अनावश्यक पृथक्करण, अविनाशी, अवधारणाओं, प्रकारों और घर्षण को नष्ट करना जो सॉफ्टवेयर के कार्य के लिए बिल्कुल आवश्यक नहीं है।

इस प्रकाश में, YAGNI का पालन करने के लिए आवश्यक क्या है पर ध्यान केंद्रित करके एक सरल और दुबला कोड-बेस सुनिश्चित करने के लिए अनुसरण करने के सर्वोत्तम सिद्धांतों में से एक है

कंबल के नियमों से बचें

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

अमान्य नियम और पैटर्न से सावधान रहें

यहां तक ​​कि सॉफ्टवेयर डिजाइन पैटर्न कई मामलों में प्रोग्रामिंग भाषा की कमी है , जहां एक भाषा में उपयोगी है अनावश्यक और अधिक सुंदर ढंग से अधिक अभिव्यंजक और शक्तिशाली भाषाओं में हल किया गया है। इसी तरह "नियम" के साथ, एक डोमेन में सावधानी बरतने की दिशानिर्देश दूसरों में लागू नहीं हो सकता है। इसलिए "नियम" से भी अधिक महत्वपूर्ण क्या है, यह वास्तव में प्रदान किए जाने वाला मूल्य है और कौन सा ठोस पक्ष-प्रभाव यह रोकने की कोशिश कर रहा है। एक बार जब हम इसके सच्चे मूल्य को समझते हैं, तो हम इसे से अधिकतम मूल्य प्राप्त करने के लिए अनुकूलित कर सकते हैं और YAGNI के साथ, यह पता लगा सकते हैं कि इसे चुनने के लिए कब लागू किया जाए

सरल पोको लाइफ

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

भारी ओआरएम मॉडल खराब डीटीओ हैं

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

स्वच्छ POCOs

OrmLite या Redis में संग्रहीत जटिल डेटा मॉडल इनमें से किसी भी समस्या से ग्रस्त नहीं है जो स्वच्छ, डिस्कनेक्ट किए गए POCOs का उपयोग करने में सक्षम हैं। वे शिथिल-युग्मित हैं, जहां केवल POCO का "आकार" महत्वपूर्ण है, यानी चलती परियोजनाएं और नाम बदलने के नाम से सीरियलाइजेशन पर असर नहीं पड़ेगा, यह RDBMS तालिकाओं में कैसे जमा होता है, Redis डेटा संरचनाएं, कैशिंग प्रदाता, आदि। भी विशिष्ट प्रकार के युग्मित नहीं, आप OrmLite में उस डेटा से डेटा को सम्मिलित करने के लिए एक भिन्न प्रकार का उपयोग कर सकते हैं जो आप इसे पढ़ने के लिए करते हैं, न ही इसे "सटीक आकार" होने की आवश्यकता है, क्योंकि OrmLite केवल डीटीओ का केवल एक सबसेट के साथ पॉपुलेट कर सकता है अंतर्निहित तालिका में उपलब्ध फ़ील्ड तालिका, दृश्य या संग्रहित प्रक्रिया के बीच कोई अंतर भी नहीं है, OrmLite खुशी से किसी भी परिणाम-निर्धारित नक्शे पर किसी भी मिलान फ़ील्ड में, दूसरों की अनदेखी करके मैप करेगा।

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

public class Poco { [Ignore] public int IgnoreInOrmLite { get; set; } [IgnoreDataMember] public int IgnoreInSerialization { get; set; } } 

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

 var dto = dbPoco.ConvertTo<Poco>(); 

अंतर्निहित ऑटो मैपिंग भी बहुत सहिष्णु है और विभिन्न प्रकार के गुणों को सह-इरैस कर सकता है, जैसे तारों से / अलग संग्रह प्रकार आदि।

डेटा स्थानांतरण ऑब्जेक्ट – डीटीओ

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

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

सेवाएं

सर्विसेज जटिलता को ढांचा बनाने का अंतिम रूप है और उच्चतम स्तर की सॉफ्टवेयर पुन: उपयोग की पेशकश करता है। वे अपनी क्षमताओं का पैकेज करते हैं और उन्हें अपने उपभोक्ताओं को एक सेवा कॉल की लागत की तुलना में किसी भी अधिक जटिलता से दूरस्थ रूप से उपलब्ध नहीं कराती है।

डीटीओ इंटरफ़ेस बनाम सेवा कार्यान्वयन

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

समानांतर क्लाइंट विकास

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

जहां तक ​​नियम चलते हैं, इसके कार्यान्वयन से डिकॉप्टेड एक अच्छी तरह से परिभाषित सेवा अनुबंध (डीटीओ) सुनिश्चित करना एक सेवा है और यह प्रदान किए जाने वाले मूल्य का बहुत सार है।

अनुरोध और उत्तर डीटीओ

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

 public class SearchProducts : IReturn<SearchProductsResponse> { public string Category { get; set; } public decimal? PriceGreaterThan { get; set; } } 

आपकी आरडीबीएमएस टेबल आम तौर पर एनॉन्स के रूप में परिभाषित संस्थाएं हैं, यानी आपकी सेवा क्या देता है:

 public class SearchProductsResponse { public List<Product> Results { get; set; } public ResponseStatus ResponseStatus { get; set; } } 

यहां तक ​​कि उत्तरदायी रिस्पांस डीटीओ जो एक परिभाषित करता है कि आपकी सेवा का रिटर्न डेटा मॉडल के रूप में फिर से उपयोग के लिए एक अच्छा उम्मीदवार नहीं है। मैं आम तौर पर सेवा प्रतिक्रियाओं के लिए असतत डीटीओ का उपयोग करता हूं क्योंकि यह मौजूदा सेवाओं को मौजूदा ग्राहकों को तोड़ने के बिना अतिरिक्त डेटा या मेटाडेटा वापस करने की अनुमति देता है।

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