5

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

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

+0

महान प्रश्न! डीटीओ के लिए flattening के लिए कोई ज़रूरत नहीं है। –

+0

डीटीओ के आप संवेदनशील डेटा (उदा। मानव संसाधन तालिका में वेतन जानकारी) सुरक्षित करने के लिए चाहते हैं, तो उपयोग करने के लिए अच्छे हैं। – mikekidder

+0

मेरे लिए डीटीओ का उपयोग करने का मुख्य कारण प्रस्तुति परत से डीएएल को कम करना है। ब्रीज़/ईएफ के साथ यह सीधे क्लाइंट को संस्थाओं को भेजने के लिए बहुत मोहक है क्योंकि बस बॉक्स से बाहर काम करता है। लेकिन decoupling के बिना, डेटाबेस संशोधन के लिए क्लाइंट-साइड जावास्क्रिप्ट तक कोड रिफैक्टरिंग की आवश्यकता हो सकती है। डरावना। –

उत्तर

5

डीटीओ के कारण हैं। "डेटा फ़्लैटनिंग" उनमें से एक है। न तो "सीमित है कि मैं तार पर कितना डेटा डाल रहा हूं"।

ब्रीज़ ऑब्जेक्ट ग्राफ़ के साथ एक अच्छा काम करता है। एक ग्राहक के लिए 100 आदेश भेजने की कल्पना करो। आप प्रत्येक आदेश डीटीओ पर ग्राहक नाम दोहराना नहीं चाहेंगे। ब्रीज़ के साथ आप ग्राहक आदेशों के लिए पूछताछ करते हैं ("विस्तार" का उपयोग करें) और आपको ग्राहक की एक प्रति और इसके साथ जाने के आदेश मिलते हैं।

 
var query = new breeze.EntityQuery.from('Customers') 
      .where('Id', 'eq', 42) 
      .expand('orders'); 

दूसरी ओर, यदि आप केवल ग्राहक नामों की एक सूची चाहते हैं, एक "प्रक्षेपण" का उपयोग करें:

 
var query = new breeze.EntityQuery.from('Customers') // all customers 
      .select('id, companyName'); // project into an anonymous 2-property object 

उपयोग कभी सर्वर साइड डीटीओ कुछ का निर्माण करने के लिए कि आप नहीं कर सकते आसानी से ग्राहक से बनाते हैं (उदाहरण के लिए, ग्राहक-और-कुल-वर्तमान-वर्ष-ऑर्डर-डॉलर)।

बिंदु यह है कि आप अपनी आवश्यकताओं के अनुरूप डीटीओ, अनुमान और इकाई प्रश्नों को मिश्रित कर सकते हैं। आपको सभी तरह से या दूसरी (मेरी राय में) नहीं जाना है।

+0

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

+0

धन्यवाद वार्ड! एसएसएस – JakeP

1

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

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

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

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

लेकिन तब DTOs का उपयोग करते हैं?

  • सुरक्षा
  • परिसर तर्क (गणना) या जब आप यह है कि आप न नहीं या नहीं कर सकते हैं (सुरक्षा) ग्राहक के पक्ष सामने आ जाएगी क्योंकि बहुत अधिक जटिलता के सरल CRUD तरीकों का उपयोग करने में सक्षम नहीं हैं।

सुरक्षा के मामले में मैं वास्तव में 100% निश्चित नहीं हूं और इसलिए मैं यहां लिख रहा हूं और दो विशेषज्ञों से पूछना चाहता हूं। हम सर्वर पक्ष पर ईएफ का उपयोग कर रहे हैं और सुरक्षा के लिए सर्वर पक्ष पर अनुमानों का उपयोग करना शायद सबसे अच्छा विचार होगा। लेकिन यह कैसे करें?

मैं इस सवाल उठाना क्योंकि मैं सवाल का जवाब देने DTOs अभी भी जरूरत है, तो के सक्षम होने के लिए जवाब देने के लिए अपनी सबसे महत्वपूर्ण लगता है।

हम एफई के लिए निम्न कोड (हमारे मूल्यांकन के डेमो में) के साथ समाप्त हुआ:

private IQueryable<News> RestrictFields(IQueryable<News> query) 
    { 
     return query 
      .ToList() // This seemd to be needed, otherwhise I cannot use new News() 
      .Select(t => new News() 
       { 
        Id = t.Id, 
        Text = t.Text, 
        Title = t.Title, 
        Date = t.Date 
       }) 
      .AsQueryable(); 
    } 

तो आप ऊपर देख सकते हैं, हम एक एफई क्वेरी की है। तो हमने पहले कोशिश की थी कि नए समाचार() के साथ एक प्रक्षेपण के लिए। यह काम नहीं करता है, क्योंकि ईएफ आपको प्रक्षेपण में डीडीओ ऑब्जेक्ट्स या अज्ञात लोगों में एक ही डीएओ कक्षा का उपयोग करने की अनुमति नहीं देता है। इसलिए हमने ToList() और फिर AsQueryable() के कामकाज का उपयोग किया। लेकिन यह सही नहीं लगता है और इसके अलावा शायद क्लाइंट से क्वेरी पैरामीटर डेटाबेस में नहीं भेजे जाते हैं और शायद कुछ इस वजह से काम नहीं करते हैं, जैसे "विस्तार"।

तो सुरक्षा कारण के लिए सर्वर साइड पर एक प्रक्षेपण करने के लिए है, तो अंत में वास्तव में DTOs के लिए जरूरत से छुटकारा पाने के लिए सबसे अच्छा तरीका क्या है? @ जॉन: मैं आप की एक पोस्ट को देखा, जहां आप कहते हैं, आप अपने प्रशिक्षण वर्ग (कोणीय और हवा) के लिए अपने प्रदर्शन परियोजना में वक्ताओं पर अनुमानों का इस्तेमाल किया है, लेकिन मैं जहां इस कार्यान्वित किया जाता है नहीं मिल cound।

यहाँ मैं वास्तव में अटक कर रहा हूँ और यह मेरे लिए पता करने के लिए DTOs अभी भी जरूरत है या नहीं कर रहे हैं, तो कड़ी, और कैसे यह तो हवा के साथ पूरी तरह से एक साथ काम कर सकते हैं।

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

सधन्यवाद,

क्रिस

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