2016-06-07 12 views
5

मैं एक मॉड्यूलर प्रोजेक्ट पर काम कर रहा हूं जो कि बहुत मॉड्यूलर के लिए डिज़ाइन किया गया है - sections of the app can be enabled and disabled for different clients using Webpack. यह संरचना अब तक मेरे लिए अच्छी तरह से काम कर रही है, लेकिन एक मुद्दा जो मैंने चलाया है यह काम कर रहा है कि उन सेवाओं को कैसे संभाला जाए जो हमेशा मौजूद नहीं हो सकते हैं।एक कोणीय सेवा तक पहुंचना जो

मेरे वर्तमान समाधान बहुत सरल है - मैं $injector.has() का उपयोग करता है, तो सेवा वर्तमान में मौजूद है की जाँच करने के लिए, और यदि ऐसा है तो, मैं $injector.get() का उपयोग यह हड़पने के लिए:

function initialize($injector) { 
    if ($injector.has("barcode")) { 
     let barcode = $injector.get("barcode"); 

     // Do stuff with the barcode service 
    } 
} 

यह काम करने के लिए लगता है - हालांकि, मैं यह कर सकते हैं ' इस पैटर्न के उपयोग पर अधिक जानकारी नहीं मिलती है और क्या इसमें कोई संभावित डाउनसाइड्स है या नहीं।

तो, मेरे सवाल कर रहे हैं:

  • वहाँ इंजेक्टर इस तरह से है कि मैं के बारे में पता होना चाहिए का उपयोग कर के लिए किसी भी चेतावनियां?
  • क्या ऐसा करने का एक बेहतर/अधिक मूर्ख तरीका है?

उत्तर

2

यह शायद सबसे अच्छा तरीका है पूरा करने के लिए आप क्या चाहते है, हालांकि, ऐसा करने में, ध्यान दें कि आप Dependency Injection (DI) से Service Locator पैटर्न से आगे बढ़ रहे हैं।

हम इस तकनीक से बचने जब तक कि हम वास्तव में इसकी जरूरत:

निम्नलिखित from the Angular 2 docs काफी प्रासंगिक (जोर मेरा) है। यह एक लापरवाही पकड़ने के बैग दृष्टिकोण को प्रोत्साहित करता है जैसे कि हम यहां देखते हैं। व्याख्या करना, समझना और परीक्षण करना मुश्किल है। हम इस वर्ग को क्या चाहिए या यह क्या करेगा, कन्स्ट्रक्टर का निरीक्षण करके हम नहीं जान सकते। यह किसी भी पूर्वजों के घटक से ही सेवाएं प्राप्त कर सकता है, न केवल अपने ही। हमें यह पता लगाने के लिए कार्यान्वित करने के लिए मजबूर होना पड़ता है कि यह क्या करता है।

फ्रेमवर्क डेवलपर्स इस दृष्टिकोण को ले सकते हैं जब उन्हें सेवाओं को सामान्य रूप से और गतिशील रूप से प्राप्त करना होगा।

(एक तरफ: यह क्या dependency injection in Angular 2 के लिए आ रहा है पर एक पढ़ने बनाना उचित है - वैकल्पिक निर्भरता, फैक्टरी प्रदाताओं, आदि)

कोणीय 1 के docs on the matter कर इसे करने के लिए संदर्भ The Law of Demeter के afoul (जो चल रहा है निश्चित रूप से एक कानून की तुलना में दिशानिर्देश के अधिक, सही?)। परिपत्र निर्भरता जहां इस प्रयोग किया जाता है की (errors thrown होने से)

  • आप चेतावनी दी नहीं किया जाएगा;:

    किसी भी मामले में, बस कुछ ऐसी बातों का पता होनी चाहिए वास्तव में, यह अक्सर ऐसी तकनीक होती है जो लोग इन चेतावनियों के आसपास पहुंचने के लिए उपयोग करते हैं।

  • जब से तुम अब क्या आप इसके साथ इंजेक्षन के अलावा $ इंजेक्टर पर निर्भरता है, अपने इकाई परीक्षण या तो $ इंजेक्टर नकली, या module('moduleThatIsUsingInjectorExplicitly', function($provide) { $provide.value('barcode', barCodeMock);} की तरह कुछ का उपयोग करने की आवश्यकता होगी।

  • ऊपर उद्धरण में उल्लिखित अनुसार, आपका कोड थोड़ा कम स्पष्ट होगा क्योंकि इन 'वैकल्पिक' निर्भरताओं को सामान्य स्थानों में परिभाषित नहीं किया गया है।

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

+0

शानदार उत्तर, बहुत बहुत धन्यवाद! कोणीय 2 की वैकल्पिक निर्भरताएं मैं जितनी अधिक हूं - यह तब तक एक स्टॉपगैप समाधान है जब तक कि हम माइग्रेट नहीं कर सकते (वर्तमान में अपडेट करने के लिए किसी तृतीय पक्ष UI ढांचे पर प्रतीक्षा कर रहे हैं, जो उम्मीद है कि इस शताब्दी में कुछ समय लगेगा ...) –

+0

निर्भर आपकी ज़रूरतों पर, 'स्टब' सेवाओं को बनाने के साथ प्रयोग करने के लायक भी हो सकते हैं जो वैकल्पिक लोगों के लिए खड़े हो सकते हैं, जिससे आप अभी भी DI प्राप्त कर सकते हैं। मुझे डबल चेक करना होगा, लेकिन मेरा मानना ​​है कि एंगुलर आपको पहले प्रदान की गई सेवा को पकड़ने की अनुमति देगा यदि आप एक ही नाम का नया खाता लोड करते हैं। और/या आप सजावटी (https://docs.angularjs.org/guide/decorators) का उपयोग करके उन 'स्टब्स' को प्रतिस्थापित या सजा सकते हैं। शायद जटिलता का वजन करने लायक है। मैंने इसका परीक्षण नहीं किया है ... – JcT

+0

हाँ, ऐसा कुछ ऐसा लगता है जो देखने लायक होगा - केवल एक मामला यह है कि जोड़ा गया जटिलता इसके लायक होगा या नहीं। मैं मिनट में अपनी फर्म में एकमात्र जावास्क्रिप्ट लड़का हूं, और मुझे हर किसी को सिखाना होगा, इसलिए मैं इसे सरल रखने की ओर झुका रहा हूं: पी –

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