এটিই আমাকে পার্থক্য বুঝতে সাহায্য করেছিল, পাস্কাল প্রেক্টের একটি ব্লগ পোস্টকে ধন্যবাদ।
একটি পরিষেবা একটি মডিউলের একটি পদ্ধতি যা নাম এবং একটি ফাংশন গ্রহণ করে যা পরিষেবাটি সংজ্ঞায়িত করে। আপনি নির্দিষ্ট উপাদানটিকে অন্য উপাদানগুলিতে যেমন কন্ট্রোলার, নির্দেশিকা এবং ফিল্টারগুলিতে ইনজেকশন এবং ব্যবহার করতে পারেন। একটি কারখানা একটি মডিউলে একটি পদ্ধতি এবং এটি একটি নাম এবং একটি ফাংশনও নেয় যা কারখানাকে সংজ্ঞায়িত করে। আমরা সার্ভিসের সাথে এটি একইভাবে ইনজেকশন এবং ব্যবহার করতে পারি।
নতুন তৈরি করা বস্তুগুলি তাদের নির্মাণকারীর ফাংশনটির প্রোটোটাইপ বৈশিষ্ট্যের মানকে তাদের প্রোটোটাইপ হিসাবে ব্যবহার করে, তাই আমি অ্যাঙ্গুলার কোডটি পেয়েছি যা অবজেক্ট.ক্রিয়েট () বলে calls যাইহোক, একটি ফ্যাক্টরি ফাংশন আসলেই কেবল একটি ফাংশন যা কল হয়ে যায়, এজন্য কারখানার জন্য আমাদের কোনও বস্তুর আক্ষরিক ফিরিয়ে দিতে হবে।
এখানে আমি কারখানার জন্য কৌনিক 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 পদ্ধতি রয়েছে যা আমাদের কারখানার ফাংশন। আপনি যখনই ইনজেক্টরকে একটি নির্দিষ্ট নির্ভরতার জন্য জিজ্ঞাসা করেন, এটি মূলত provider get () পদ্ধতিতে কল করে সংশ্লিষ্ট সরবরাহকারীকে সেই পরিষেবাটির একটি উদাহরণ জিজ্ঞাসা করে। এজন্য সরবরাহকারী তৈরি করার সময় $ get () প্রয়োজন।
পরিষেবার জন্য এখানে কৌনিক 1.5 কোড রয়েছে।
function service(name, constructor) {
return factory(name, ['$injector', function($injector) {
return $injector.instantiate(constructor);
}]);
}
দেখা যাচ্ছে যে যখন আমরা পরিষেবা () কল করি, তখন এটি আসলে ফ্যাক্টরি কল করে ()! যাইহোক, এটি কেবল আমাদের পরিষেবা কনস্ট্রাক্টর ফাংশনটি কারখানায় যেমন পাস করে না। এটি এমন একটি ফাংশনও পাস করে যা ইঞ্জেক্টরকে প্রদত্ত কন্সট্রাক্টরের দ্বারা কোনও বস্তু তাত্ক্ষণিক করতে বলে।
অন্য কথায়, আমরা যদি কোথাও মাই সার্ভিস ইনজেক্ট করি, কোডে যা ঘটে তা হ'ল:
MyServiceProvider.$get(); // return the instance of the service
এটি পুনরায় চালু করতে, একটি পরিষেবা একটি কারখানাকে কল করে, যা সংশ্লিষ্ট সরবরাহকারীর a get () পদ্ধতি। তদুপরি, $ injector.instantiate () হ'ল এমন পদ্ধতি যা শেষ পর্যন্ত কনস্ট্রাক্টর ফাংশন দিয়ে অবজেক্ট.ক্রিয়েট () বলে। এজন্য আমরা পরিষেবাগুলিতে "এটি" ব্যবহার করি।
ES5- র ক্ষেত্রে এটি ব্যবহার করা যায় না যা আমরা ব্যবহার করি: পরিষেবা () বা কারখানা (), এটি সর্বদা একটি ফ্যাক্টরি বলা হয় যা আমাদের পরিষেবার জন্য সরবরাহকারী তৈরি করে।
আপনি পাশাপাশি পরিষেবাগুলির সাথে একই জিনিসটি করতে পারেন। একটি পরিষেবাদি একটি কনস্ট্রাক্টর ফাংশন, তবে এটি আমাদের বস্তুর আক্ষরিক প্রত্যাবর্তন থেকে বাধা দেয় না। সুতরাং আমরা আমাদের পরিষেবা কোডটি নিতে পারি এবং এটি এমনভাবে লিখতে পারি যে এটি মূলত আমাদের কারখানার মতোই একই কাজটি করে বা অন্য কথায়, আপনি কোনও জিনিস ফেরত দেওয়ার জন্য কারখানা হিসাবে কোনও পরিষেবা লিখতে পারেন।
কেন বেশিরভাগ লোকেরা পরিষেবাগুলির মাধ্যমে কারখানাগুলি ব্যবহার করার পরামর্শ দেন? এটি আমি দেখেছি সেরা উত্তর যা পাওয়েল কোজলোস্কির বইটি থেকে এসেছে: অ্যাঙ্গুলারজেএস-এর সাথে মাস্টারিং ওয়েব অ্যাপ্লিকেশন ডেভলপমেন্ট।
কারখানার পদ্ধতিটি অ্যাংুলারজেএস নির্ভরতা ইনজেকশন সিস্টেমে জিনিসগুলি পাওয়ার সর্বাধিক সাধারণ উপায়। এটি অত্যন্ত নমনীয় এবং পরিশীলিত সৃষ্টি যুক্তি থাকতে পারে। কারখানাগুলি নিয়মিত কাজ করে, তাই আমরা "ব্যক্তিগত" ভেরিয়েবলগুলি অনুকরণ করার জন্য একটি নতুন লেজিকাল স্কোপের সুবিধাও নিতে পারি। এটি একটি কার্যকর পরিষেবার হিসাবে আমরা কোনও প্রদত্ত পরিষেবাদির বাস্তবায়ন বিবরণ গোপন করতে পারি "