यह वही है जिसने मुझे अंतर को समझने में मदद की, पास्कल प्रीचट के एक ब्लॉग पोस्ट के लिए धन्यवाद।
एक सेवा एक मॉड्यूल पर एक विधि है जो एक नाम और एक फ़ंक्शन लेता है जो सेवा को परिभाषित करता है। आप उस विशेष सेवा को अन्य घटकों जैसे नियंत्रक, निर्देश और फ़िल्टर में इंजेक्ट और उपयोग कर सकते हैं। एक कारखाने मॉड्यूल पर एक विधि है और यह एक नाम और एक फ़ंक्शन भी लेता है, जो कारखाने को परिभाषित करता है। हम इसे उसी तरह से इंजेक्ट और उपयोग कर सकते हैं जैसे हमने सेवा के साथ किया था।
नई के साथ बनाई गई वस्तुएँ उनके निर्माता फ़ंक्शन के प्रोटोटाइप संपत्ति के मूल्य को उनके प्रोटोटाइप के रूप में उपयोग करती हैं, इसलिए मुझे एंगुलर कोड मिला जो Object.create () कहता है, मेरा मानना है कि यह सेवा निर्माता फ़ंक्शन है जब यह त्वरित हो जाता है। हालांकि, एक फैक्ट्री फ़ंक्शन वास्तव में केवल एक फ़ंक्शन है जिसे कॉल किया जाता है, यही वजह है कि हमें फैक्ट्री के लिए एक वस्तु शाब्दिक लौटना पड़ता है।
यहाँ कोणीय 1.5 कोड है जो मुझे कारखाने के लिए मिला है:
var needsRecurse = false;
var destination = copyType(source);
if (destination === undefined) {
destination = isArray(source) ? [] : Object.create(getPrototypeOf(source));
needsRecurse = true;
}
कारखाने के लिए कोणीय स्रोत कोड स्निपेट () फ़ंक्शन:
function factory(name, factoryFn, enforce) {
return provider(name, {
$get: enforce !== false ? enforceReturnValue(name, factoryFn) : factoryFn
});
}
यह नाम और फैक्ट्री फ़ंक्शन लेता है जो पारित हो जाता है और एक प्रदाता को उसी नाम से लौटाता है, जिसमें $ प्राप्त करने की विधि होती है जो हमारे कारखाने का कार्य है। जब भी आप इंजेक्टर को एक विशिष्ट निर्भरता के लिए पूछते हैं, तो यह मूल रूप से उस प्रदाता की उस सेवा के लिए $ get () पद्धति को कॉल करके पूछता है। इसलिए प्रदाता बनाते समय $ प्राप्त () की आवश्यकता होती है।
यहां सेवा के लिए कोणीय 1.5 कोड है।
function service(name, constructor) {
return factory(name, ['$injector', function($injector) {
return $injector.instantiate(constructor);
}]);
}
यह पता चला है कि जब हम सेवा () कहते हैं, तो यह वास्तव में कारखाना () कहता है! हालाँकि, यह कारखाने के लिए हमारे सेवा निर्माण कार्य को पास नहीं करता है। यह एक फ़ंक्शन भी पास करता है जो इंजेक्टर को दिए गए कंस्ट्रक्टर द्वारा किसी वस्तु को तुरंत हटाने के लिए कहता है।
दूसरे शब्दों में, यदि हम MyService को कहीं इंजेक्ट करते हैं, तो कोड में क्या होता है:
MyServiceProvider.$get(); // return the instance of the service
इसे फिर से स्थापित करने के लिए, एक सेवा एक कारखाने को बुलाती है, जो संबंधित प्रदाता पर एक $ प्राप्त () विधि है। इसके अलावा, $ injector.instantiate () वह विधि है जो अंततः कंस्ट्रक्टर फ़ंक्शन के साथ Object.create () को कॉल करती है। इसलिए हम सेवाओं में "इस" का उपयोग करते हैं।
ES5 के लिए यह कोई फर्क नहीं पड़ता कि हम किसका उपयोग करते हैं: सेवा () या कारखाना (), यह हमेशा एक कारखाना है जिसे कहा जाता है जो हमारी सेवा के लिए एक प्रदाता बनाता है।
आप सेवाओं के साथ भी ठीक यही काम कर सकते हैं। एक सेवा एक निर्माण कार्य है, हालांकि, यह हमें वस्तु शाब्दिक रिटर्न से नहीं रोकता है। इसलिए हम अपना सेवा कोड ले सकते हैं और इसे इस तरह से लिख सकते हैं कि यह मूल रूप से हमारे कारखाने या दूसरे शब्दों में ठीक वैसा ही काम करता है, आप किसी वस्तु को वापस करने के लिए एक कारखाने के रूप में सेवा लिख सकते हैं।
ज्यादातर लोग सेवाओं पर कारखानों का उपयोग करने की सलाह क्यों देते हैं? यह सबसे अच्छा उत्तर है जो मैंने देखा है जो पावेल कोज़लोस्की की पुस्तक: मास्टेरिंग वेब एप्लीकेशन डेवलपमेंट विथ एंगुलरजेएस।
फैक्ट्री विधि एंगुलरजेएस निर्भरता इंजेक्शन प्रणाली में वस्तुओं को प्राप्त करने का सबसे आम तरीका है। यह बहुत लचीला है और इसमें परिष्कृत सृजन तर्क हो सकते हैं। चूंकि कारखाने नियमित कार्य हैं, इसलिए हम "निजी" चर का अनुकरण करने के लिए एक नए शाब्दिक दायरे का लाभ भी उठा सकते हैं। यह बहुत उपयोगी है क्योंकि हम किसी दिए गए सेवा के कार्यान्वयन विवरण छिपा सकते हैं। ”