2011-11-15 18 views
7

मैं जानना चाहता हूं कि डीटीओ वस्तुओं के रचनाकारों को डिजाइन करने में सबसे अच्छा अभ्यास क्या है।सी # कन्स्ट्रक्टर और निर्भरता इंजेक्शन

कहना मैं इस तरह की एक Dto वस्तु है:

मैं एक निर्माता की घोषणा कर सकता है:

public CustomerDto(string name, string surname, string phone, ...) 
{ 
    this.Name = name; 
    this.Surname = surname; 
    this.Phone = phone; 
    ... 
} 

जब आप यह देख

class CustomerDto 
{ 
    public string Name { get; set; } 
    public string Surname { get; set; } 
    public string Phone { get; set; } 
    ... 
} 

वहाँ वस्तु के निर्माण के लिए कई तरीके हैं कन्स्ट्रक्टर और तत्काल एक एसआरपी (एकल जिम्मेदारी) उल्लंघन का निष्कर्ष निकाला?

भले ही ये गुण सभी संबंधित हैं।

कोई भी तर्क दे सकता है कि गुणों को प्रमाणित करने की कोई आवश्यकता नहीं है क्योंकि यह एक डीटीओ है और इसका कोई व्यवहार नहीं है, और व्यवहार डोमेन ऑब्जेक्ट पर होना चाहिए जो इस मानचित्र से है।

सी # में हम भी अधिक सुंदर ढंग से इस वस्तु का निर्माण कर सकते हैं:

var dto = new CustomerDto() 
{ 
    Name = "Some name", 
    Surname = "Some surname" 
} 

या एक धाराप्रवाह बिल्डर या इस तरह के NBuilder के रूप में एक रूपरेखा का उपयोग करें।

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

कृपया मुझे यह समझाने में मदद करें कि कौन सा बेहतर तरीका है।

+0

संभावित डुप्लिकेट [निर्भरता इंजेक्शन - डेटा ट्रांसफर ऑब्जेक्ट्स (डीटीओ) के साथ उपयोग?] (Http: // stackoverflow।कॉम/प्रश्न/6297322/निर्भरता-इंजेक्शन-डेटा-ट्रांसफर-ऑब्जेक्ट्स-डीटीओएस के साथ-साथ) –

+0

मैं इसी समस्या में आया, और कन्स्ट्रक्टर के खिलाफ फैसला किया .. एक साधारण कारण के लिए: बाद में, एक महीने में, या 6 महीनों, मैं या कोई और इसे देखने जा रहा है और इसके बारे में सोचना है वैसे ही खुद (और खुद) सोच रहे हैं। मुझे कोड पढ़ने के दौरान सोच मिल गई है यह एक संकेत है कि यह बहुत जटिल है। – dferraro

उत्तर

10

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

इसके अलावा डीटीओ को आईओसी कंटेनर द्वारा नहीं बनाया जाना चाहिए और इसकी कोई वास्तविक निर्भरता नहीं है। आपको अपने दृढ़ता ढांचे या ऑटो मैपिंग का उपयोग करके उन्हें मैन्युअल रूप से बनाना चाहिए।

यदि किसी कन्स्ट्रक्टर या गुणों का उपयोग करके मान निर्दिष्ट करना बेहतर है तो उपयोग पर निर्भर करता है। यदि उन्हें आवश्यक है तो कन्स्ट्रक्टर संस्करण बेहतर है। यदि वे वैकल्पिक हैं तो संपत्ति का तरीका बेहतर है।

+0

मुझे इस उत्तर के बारे में क्या पसंद है यह पुष्टि करता है कि मैं निर्भरता के बारे में क्या कहता हूं और ये वास्तव में निर्भरता नहीं हैं कि वे बाहरी उप-सिस्टम नहीं हैं जिन्हें आप एक आईओसी कंटेनर को प्रतिस्थापित करना चाहते हैं। इसके अलावा विकल्प 2 का कारण यह है कि यह वास्तव में ऑटो मैपिंग ढांचे को अपनी चीज करने की इजाजत देता है, यह केवल सीमाओं के बीच डेटा रखता है। मुझे लगा कि एक नाम तर्क कहने की आवश्यकता वाले डॉट की चिंता ऐसा कुछ नहीं है जिसके बारे में वास्तव में चिंतित है? इस बात से सहमत? – Andre

3

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

तो मैं पसंद करते हैं:

public CustomerDto(string name, string surname, string phone, ...) 

डीटीओ एक डाटा ट्रांसफर वस्तु है, विशेष रूप से सम्पत्तियों का एक समूह का प्रतिनिधित्व करने के लिए एक प्रणाली (के रूप में अच्छी तरह से वितरित) सीमाओं के पार पारित होने के लिए है, इसलिए बहुत ज्यादा SRP के बारे में परेशान नहीं करते उल्लंघन। यह फेकाडे डिजाइन पैटर्न की तरह है, यह उपयोग को सरल बनाने के लिए संचालन/सेवाओं का एक सेट abstarcts। तो इस केज़ में Keep It Simple जीता।

+1

मैं क्या सोच रहा हूं कि मार्टिन फाउलर डेटा ट्रांस्फर ऑब्जेक्ट को उस ऑब्जेक्ट के रूप में वर्णित करता है जिसमें राज्य होता है और कोई व्यवहार नहीं होता है और वास्तव में विधि कॉल को कम करने के तरीके के रूप में इसे अस्वीकार करता है। कन्स्ट्रक्टर तर्क प्रस्तुत करके और उन्हें सत्यापित करके आप व्यवहार जोड़ रहे हैं। ध्यान रखें कि उद्देश्य डोमेन से मानचित्र पर मानचित्र बनाना है और डोमेन ऑब्जेक्ट पर सत्यापन संभवतः होता है। तो क्या वास्तव में तर्कों के बारे में चिंता करने की ज़रूरत है और क्या आवश्यक है क्योंकि यह कहीं और डेटा ले जा रहा है और सत्यापन एक अलग चिंता है? – Andre

+1

'शून्य नहीं'/'खाली नहीं 'जैसे तर्क सत्यापन एक ऑब्जेक्ट व्यवहार नहीं है, इसे अपने एप्लिकेशन फ्रेमवर्क सेवा सामग्री की तरह मानें। लेकिन अगर आप 'if (customerRole == भूमिकाएं। वीआईपी) बढ़ाएं बोनस (x) '- यह वास्तव में व्यवहार होगा और डीटीओ में नहीं होना चाहिए, डीटीओ किसी ऑब्जेक्ट के अंतिम सैट का प्रतिनिधित्व करता है – sll

+0

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

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