मैं सोच रहा हूं क्योंकि अगर यह है, तो एंटिटी फ्रेमवर्क परतों के बीच डेटा स्थानांतरित करने के लिए समान गुणों के साथ एक नई वस्तु बनाने के लिए तर्क क्यों नहीं देता है?
मैं इकाई वस्तुओं का उपयोग करता हूं जो मैं इकाई ढांचे के साथ उत्पन्न करता हूं।
मैं सोच रहा हूं क्योंकि अगर यह है, तो एंटिटी फ्रेमवर्क परतों के बीच डेटा स्थानांतरित करने के लिए समान गुणों के साथ एक नई वस्तु बनाने के लिए तर्क क्यों नहीं देता है?
मैं इकाई वस्तुओं का उपयोग करता हूं जो मैं इकाई ढांचे के साथ उत्पन्न करता हूं।
जवाबों:
यह आप पर निर्भर है।
अधिकांश लोग आपको बताएंगे कि यह एक अच्छा अभ्यास नहीं है, लेकिन आप कुछ मामलों में इससे दूर हो सकते हैं।
EF ने कई कारणों से DDD के साथ अच्छी तरह से कभी नहीं खेला, लेकिन दो बाहर खड़े हैं: आप अपनी संस्थाओं पर पैरामीटर का निर्माण नहीं कर सकते हैं और आप संग्रह को एन्क्रिप्ट नहीं कर सकते हैं। DDD उस पर निर्भर करता है, क्योंकि डोमेन मॉडल में डेटा और व्यवहार दोनों शामिल होने चाहिए।
एक तरह से, ईएफ आपको एनीमिक डोमेन मॉडल रखने के लिए मजबूर करता है और इस मामले में आप संस्थाओं को डीटीओ के रूप में उपयोग कर सकते हैं। यदि आप नेविगेशन गुणों का उपयोग करते हैं तो आप कुछ मुद्दों में भाग सकते हैं, लेकिन आप उन संस्थाओं को अनुक्रमित कर सकते हैं और उन्हें तार पर भेज सकते हैं। यह व्यावहारिक नहीं हो सकता है। आपको प्रत्येक इकाई के लिए क्रमांकन को नियंत्रित करना होगा जिसमें ऐसे गुण हैं जिन्हें आपको भेजने की आवश्यकता नहीं है। आसान तरीका यह है कि डेटा ट्रांसफर के लिए अलग-अलग कक्षाओं को डिज़ाइन किया जाए। इस उद्देश्य के लिए AutoMapper जैसी लाइब्रेरी बनाई जाती हैं।
उदाहरण के लिए: मान लीजिए कि आपके पास Person
निम्नलिखित परिभाषा के साथ एक वर्ग है :
public class Person
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime DateOfBirth { get; get; }
// plus a bunch of other properties relevant about a person
}
मान लें कि आप कहीं कर्मचारियों की एक सूची प्रदर्शित करना चाहते हैं, यह सिर्फ भेजने के लिए व्यावहारिक हो सकता है Id
, FirstName
और LastName
। लेकिन आपको अन्य सभी अप्रासंगिक गुणों को भेजना होगा। यदि आप प्रतिक्रिया के आकार के बारे में परवाह नहीं करते हैं, तो यह एक बड़ा मुद्दा नहीं है, लेकिन सामान्य विचार सिर्फ प्रासंगिक डेटा भेजने का है। दूसरी ओर, आप एक एपीआई डिज़ाइन कर सकते हैं जो व्यक्तियों की सूची लौटाता है और उस स्थिति में सभी संपत्तियों को भेजने की आवश्यकता हो सकती है, इस प्रकार संस्थाओं को अनुक्रमित करने और भेजने के लिए समझ में आता है। इस मामले में, डीटीओ वर्ग बनाना बहस का विषय है। कुछ लोग संस्थाओं और डीटीओ को मिलाना पसंद करते हैं, कुछ लोग नहीं।
आपके अद्यतन प्रश्न का उत्तर देने के लिए, EF एक ORM है। इसका काम डेटाबेस रिकॉर्ड को ऑब्जेक्ट में मैप करना और इसके विपरीत है। ईएफ से गुजरने से पहले और बाद में आप उन वस्तुओं के साथ क्या करते हैं, यह इसकी चिंताओं का हिस्सा नहीं है। और न ही होना चाहिए।
नहीं ऐसा नहीं है।
आदर्श रूप से, डीटीओ आपकी दृढ़ता रिपॉजिटरी (उर्फ, आपके डेटाबेस टेबल) से मेल खाएगा।
लेकिन आपकी व्यावसायिक कक्षाएं जरूरी नहीं कि एक मेल हों। डेटाबेस में आपके पास अतिरिक्त कक्षाओं की आवश्यकता हो सकती है, या अलग हो सकते हैं या कक्षाओं में शामिल हो सकते हैं। यदि आपका आवेदन छोटा है, तो आप वास्तव में इस तरह की समस्याओं को नहीं देख सकते हैं, लेकिन मध्यम से बड़े अनुप्रयोगों में, यह अक्सर होगा।
एक और बात यह है कि डीटीओ उस क्षेत्र के हिस्से हैं जो कुछ भी यह है कि दृढ़ता के साथ काम करता है, जबकि आपके बिजनेस लेयर को उनके बारे में कुछ भी नहीं पता होना चाहिए।
यह वास्तव में एक बहुत बुरा विचार है। मार्टिन फाउलर का स्थानीय डीटीओ के बारे में एक लेख है ।
लंबी कहानी छोटी, DTO
पैटर्न का उपयोग प्रक्रिया के बाहर डेटा स्थानांतरित करने के लिए किया गया था, उदाहरण के लिए तार पर और एक ही प्रक्रिया के अंदर परतों के बीच नहीं।
नहीं, यह एक बुरा अभ्यास है।
कुछ कारणों से:
@JsonIgnore
जावा दुनिया से) का उपयोग करके फ़ील्ड्स को अनदेखा कर सकते हैं , लेकिन इससे अगली समस्या हो सकती है ...get
इकाई की एक विधि को कॉल करने के लिए।तो, इस काम में मदद करने के लिए कुछ प्रकार के मैपर टूल का उपयोग करना आसान और सुरक्षित है, इकाई फ़ील्ड को Dto पर मैप करना।
@Dherik ने जो कहा, उसे पूरा करने के लिए डेटा ट्रांसफर ऑब्जेक्ट के रूप में एंटिटी ऑब्जेक्ट्स का उपयोग करने की मुख्य समस्याएं हैं:
लेन-देन में, आप अपनी इकाई पर किए गए परिवर्तनों को करने का जोखिम उठाते हैं क्योंकि आप इसे डीटीओ के रूप में उपयोग करते हैं (भले ही आप लेनदेन में सत्र की इकाई को अलग कर सकते हैं, ज्यादातर समय आपको इस राज्य की जांच करने की आवश्यकता होगी आपकी इकाई-डीटीओ पर कोई भी संशोधन और यह आश्वासन दें कि आप लेन-देन में नहीं हैं या यदि आप संशोधन को जारी नहीं रखना चाहते हैं तो सत्र को बंद कर दिया गया है)।
ग्राहक और सर्वर के बीच आपके द्वारा साझा किए गए डेटा का आकार: कभी-कभी आप अनुरोध की प्रतिक्रिया के आकार को कम करने के लिए ग्राहक को किसी इकाई की सभी सामग्री नहीं भेजना चाहते हैं। डीटीओ को इकाई से अलग करना अधिक लचीला है, इसलिए उस डेटा को विशेषज्ञ करना जो आप कुछ उपयोग-मामलों में भेजना चाहते हैं।
दृश्यता और रखरखाव: आपको अपनी इकाई के क्षेत्रों पर अपने jpa / hibernate एनोटेशन का प्रबंधन करना होगा और एक ही स्थान पर json में क्रमबद्ध करने के लिए jackson एनोटेशन को बनाए रखना होगा (भले ही आप उन्हें उनके द्वारा विरासत में दिए गए इंटरफ़ेस में डालकर इकाई कार्यान्वयन से अलग कर सकते हैं इकाई)। फिर, यदि आप एक नए क्षेत्र को जोड़ने में अपनी डीटीओ सामग्री को बदलते हैं, तो दूसरा व्यक्ति शायद सोच सकता है कि यह इकाई का एक क्षेत्र है, इसलिए आपके डेटाबेस में संबंधित तालिका का एक क्षेत्र (भले ही आप @Transient
अपने सभी डीटीओ फ़ील्ड पर एनोटेशन का उपयोग कर सकते हैं) मामले के लिए ..!)।
मेरी राय में, जब आप इकाई को पढ़ते हैं तो यह शोर पैदा करता है, लेकिन मेरी राय निश्चित रूप से व्यक्तिपरक है।