7

मैं कुछ दिनों के लिए प्याज वास्तुकला का अध्ययन कर रहा हूं। मैं समझता हूं कि निर्भरताओं को हमेशा केंद्र की तरफ जाना चाहिए और इसे पूरा करने के लिए निर्भरता इंजेक्शन का उपयोग कैसे करना चाहिए। लेकिन मेरे पास कुछ प्रश्न हैं जो मैं अभी भी समझ नहीं पाया।प्याज वास्तुकला पर सेवाओं और भंडारों को कैसे कार्यान्वित करें?

  1. क्या कोई मॉडल (या इकाई) एक भंडार इंटरफ़ेस या सेवा इंटरफ़ेस का संदर्भ दे सकता है?

    उदाहरण के लिए: एक Order इकाई एक DeliveryCity संबंध Oder.DeliveryZip संपत्ति है, जो एक विदेशी कुंजी है नहीं के माध्यम से स्थापित है, लेकिन अद्वितीय है। एक ज़िप के लिए शहर के पाने के लिए, मैं ICityRepository.FindByZip(zip)

    कॉल करना होगा मैं अपने मॉडल में निम्न कोड

    class Order 
    { 
        . . . 
    
        [Inject] 
        public ICityRepository CityRepository { get; set; } 
    
        private City _dCity; 
    
        public City DeliveryCity { 
         get { 
          if (_dCity == null) 
           _dCity = this.CityRepository.FindByZip(this.DeliveryZip); 
    
          return _dCity; 
         } 
        } 
        . . . 
    } 
    
  2. क्या उपरोक्त कोड की समस्याओं हो सकता है? क्या इसे इसके बजाय डोमेन सेवा का उपयोग करना चाहिए?

  3. क्या डोमेन सेवाओं के कार्यान्वयन कोर या इंफ्रास्ट्रक्चर परत पर परिभाषित किए जाने चाहिए?

उत्तर

5

यह वह जगह है जहां कारखाने डोमेन में फिट होते हैं। ऑर्डर फैक्ट्री निर्भरता ले सकता है, जैसे IOrderRepository पर निर्भरता के साथ-साथ आईसीटीआर रिपोजिटरी पर निर्भरता। जब फैक्ट्री का उपयोग ऑर्डर इकाई बनाने (या पुनर्गठन) करने के लिए किया जाता है, तो फैक्ट्री शहर को देख सकती है और ऑर्डर संपत्ति को तदनुसार सेट कर सकती है। या, जैसा कि हर्ज़मेस्टर सुझाव देता है, इसे आलसी का उपयोग करके सेट करें ताकि लुकअप केवल तभी किया जा सके जब आवश्यक हो।

+0

यह सही समझ में आता है! मैं खुद से पूछ रहा हूं "मैं इसे कैसे याद कर सकता हूं?"! धन्यवाद! – svallory

+1

यह एक गलती है। डीडीडी कारखाना पुनर्गठन के लिए ज़िम्मेदार नहीं है। पुनर्विचार एक वस्तु का मध्य जीवन है, फैक्ट्री केवल जीवन की शुरुआत से संबंधित है। कृपया यह उत्तर देखें: http://stackoverflow.com/a/10264669/625332 – Dmitry

+0

मैं असहमत हूं। किसी ऑब्जेक्ट के उदाहरण बनाने के लिए कारखानों का उपयोग किया जाता है। वे किसी ऑब्जेक्ट के जीवन चक्र की शुरुआत में हो सकते हैं या पुनर्गठन के लिए उपयोग किए जा सकते हैं। वे दो विधियों या दो अलग-अलग वर्गों के साथ एक ही कक्षा हो सकते हैं। किसी भी तरह से, मैं इस बात से सहमत हूं कि कारखाने प्रत्येक मामले में कैसे व्यवहार करता है इसमें एक अंतर है। मेरे पास आमतौर पर भंडार की निर्भरता के रूप में पुनर्गठन कारखाना होता है जो डेटा स्टोर से प्राप्त डेटा के साथ नए उदाहरण बनाने और पुनर्निर्माण के लिए कारखाने में प्रतिनिधि होता है। अधिक जानकारी के लिए, इवांस पेज 145 देखें: "संग्रहीत ऑब्जेक्ट्स को पुन: स्थापित करना" – SonOfPirate

5

क्या उपरोक्त कोड की समस्याओं हो सकता है? क्या इसे इसके बजाय डोमेन सेवा का उपयोग करना चाहिए?

दो बातें यहाँ पर विचार करने के:

  1. ICityRepository दूसरे शब्दों में आदेश अपने अन्य तरीकों के लिए इसकी आवश्यकता नहीं है, आदेश के लिए एक असली निर्भरता नहीं है। असली निर्भरता कुछ ऐसा है जो वस्तु बिना काम नहीं कर सकती है। तो आप इसे 'GetDeliveryCity' जैसी विधि के पैरामीटर के रूप में पास करने पर विचार करना चाहेंगे (विवरण के लिए this देखें)।

  2. ज़िप कोड द्वारा शहर ढूंढना आदेश की ज़िम्मेदारी जैसा प्रतीत नहीं होता है। आदेश के लिए cohesive होने के लिए इसे केवल ऑर्डर-संबंधित कार्यक्षमता से निपटना होगा। आप इस कार्यक्षमता को ऑर्डर क्लास से बाहर ले जाना चाह सकते हैं।

डोमेन सेवाओं कार्यान्वयन कोर के अंदर या बुनियादी सुविधाओं परत में परिभाषित किया जाना चाहिए?

कोर के अंदर यदि यह वास्तव में डोमेन सेवा (एप्लिकेशन सेवा नहीं है)।

0
  1. कैसे

    private Lazy<City> _dCityLazy; 
    
    public City DeliveryCity { 
        get { 
         return _dCityLazy.Value; 
        } 
    } 
    

    जहाँ आप कुछ तंत्र द्वारा Lazy<City> इंजेक्षन था के बारे में?

  2. आप इस उदाहरण में बाहर से इंजेक्शन द्वारा flexibly तय करेंगे।

  3. मैं कहूंगा कि यह वास्तव में निर्भर करता है कि एक विशेष डोमेन सेवा क्या करती है और इसका उपयोग कहां किया जाता है।

+0

आईओसी के माध्यम से शहर को इंजेक्शन करने से निर्भरता इंजेक्टर को व्यवसाय नियम जोड़ना होगा, जो वास्तव में खराब है। मुझे यकीन नहीं है कि आपने जो प्रस्ताव दिया है वह है। – svallory

+0

निश्चित रूप से निर्भरता इंजेक्टर में व्यवसाय नियम वास्तव में खराब है, लेकिन ऐसा नहीं होना चाहिए। कई अन्य संभावनाएं हैं। बीच में एक डोमेन सेवा हो सकती है। या, सरल आईडी लुक-अप जाहिर तौर पर एक भंडार का काम है, जिसमें वास्तविक विधि है, जहां से 'आलसी ' के प्रतिनिधि को संदर्भित किया जाएगा। आम तौर पर, मैं अपनी संस्थाओं को सरल रखना चाहता हूं, यानी वास्तविक दृढ़ता की संरचना के बिना किसी ज्ञान के, यानी सेवाओं या भंडारों के संदर्भ के बिना। – herzmeister