6

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

सवाल:

  1. हम कैसे/Newing के बिना एक डीटीओ का उपयोग बना सकता हूँ उन्हें या सेवा लोकेटर विरोधी पैटर्न का उपयोग कर? यह संरचना रूट में एक खाली डीटीओ ऑब्जेक्ट लिखने और इसे कन्स्ट्रक्टर के माध्यम से सेवा कक्षा में इंजेक्ट करने के लिए ज्यादा समझ में नहीं आता है, क्योंकि मैं वास्तव में सूची को पॉप्युलेट करते समय डीटीओ का अस्थायी चर के रूप में उपयोग कर रहा हूं।

  2. कोड में आप डीटीओ को नए बनाने का एक उदाहरण देख सकते हैं। लेकिन अगर मैंने डीटीओ को पहले स्थान पर इंटरफेस लागू नहीं किया है तो इससे बेहतर अधिक महसूस नहीं होता है। तो क्या उन्हें इंटरफेस लागू नहीं करना चाहिए और इस प्रकार, डीटीओ के साथ डीआई का उपयोग नहीं करना चाहिए?


public class Services : IServices 
{  
    public IList<IDTO> GetDTOs() 
    {  
     ... 
     List<IDTO> dtos = new List<IDTO>(); 
     foreach (c in d) 
     { 
      DTO dto = new DTO(); 
      dto.x = c.x; 
      dto.y = c.y; 
      dto.z = c.z; 
      dtos.Add(dto); 
     } 
     return dtos; 
    }  
} 
+0

संबंधित: http://stackoverflow.com/questions अपने उदाहरण के मामले में (जहाँ मैं नाममात्र प्रकार आदेश की वस्तु "से" बनाया है)/4835046/क्यों-नहीं-उपयोग-ए-आईओसी-कंटेनर-टू-रेज़ोल्यूशन-निर्भरता-संस्थाओं के लिए-व्यवसाय-ओब्जेक –

+0

दिलचस्प उत्तरों के साथ डुप्लिकेट: http://stackoverflow.com/questions/8135894/c-sharp- डीटीओ-कन्स्ट्रक्टर-एंड-निर्भरता-इंजेक्शन/8136059 # 8136059 –

उत्तर

12

यह DTOs के लिए किसी भी डि उपयोग करने के लिए मेरे लिए बहुत मतलब नहीं है। मैं शायद अपने मॉडल ऑब्जेक्ट्स के लिए डीटीओ प्राप्त करने के लिए फैक्टरी पैटर्न का उपयोग करूंगा।

डीटीओ को कंटेनर द्वारा प्रबंधित उनके जीवन चक्र की आवश्यकता नहीं है; मैं बस new उन्हें होगा। अधिक इंजीनियर नहीं है।

8

मुझे नहीं लगता कि डीटीओ को इंटरफेस लागू करना चाहिए, क्योंकि वे व्यवहार को लागू करने की संभावना नहीं रखते हैं।

उन्हें इंजेक्शन भी नहीं दिया जाना चाहिए। सभी वस्तुओं को नहीं होना चाहिए। मुझे लगता है कि यह नया करने के लिए एक उचित कॉल है: ऑब्जेक्ट बनाएं, इसका इस्तेमाल करें, इसे दायरे से बाहर जाने दें और जीसीएड बनें।

1

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

public class Services : IServices 
{  
    public IList<DTO> GetDTOs() 
    {  
     ... 
     Mapper.CreateMap<Order, DTO>(); // move map creation to startup routine 
     var dtos = new List<DTO>(); 
     foreach (c in d) 
     { 
      dtos.Add(Mapper.Map<Order, DTO>(c)); 
     } 
     return dtos; 
    } 
} 

या इसका उपयोग करते LINQ

public class Services : IServices 
{  
    public IList<DTO> GetDTOs() 
    {  
     ... 
     Mapper.CreateMap<Order, DTO>(); // move map creation to startup routine 
     return d.Select(c => Mapper.Map<Order, DTO>(c)).ToList(); 
    } 
} 
+1

+1 अच्छा जवाब। आपको एएम के मैपिंग एरे के लिए समर्थन में इस्तेमाल किया जाना चाहिए - यानी आप 'Mapper.Map (xs) 'कर सकते हैं। सुनिश्चित नहीं है कि एक आईएलआईस्ट एक है) आवश्यक बी) एएम द्वारा समर्थित ओओटीबी, लेकिन अगर आपने ओबीवी टोस्टिस्ट आवश्यक किया –

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