নির্ভরতা ইনজেকশন বনাম পরিষেবা লোকেটার

আনপ্লেশ-এ জন কার্লিসেলের ছবি

সেখানে থাকা অনেক বিকাশকারী নির্ভরতা ইনজেকশন এবং পরিষেবা লোকেটার ডিজাইনের ধরণগুলির মধ্যে পার্থক্য দেখতে পান না। হ্যাঁ, উভয়ই একই সমস্যাটি সমাধান করার চেষ্টা করছেন - ডিউপলিং বৃদ্ধি করুন। স্কেলিং, টেস্টিং বা কেবল কোডটি পড়ার ক্ষেত্রে এটি আমাদের কী লাভ দেয় তা আমরা সকলেই জানি।

যাইহোক, কখন নির্ভরতা ইনজেকশন ব্যবহার করতে হবে এবং পরিষেবা পরিষেবাটি কখন ব্যবহার করতে হয় তা আমি কীভাবে জানতে পারি? আমি বলব যে উপযুক্ত হলে আমাদের উভয়টি ব্যবহার করা উচিত।

যদি আমাকে এমন একটি ক্রিয়া বাছাই করতে বলা হয় যা নির্ভরতা ইনজেকশন প্যাটার্নটিকে সর্বোত্তমভাবে বর্ণনা করে তবে আমি "দিতে" বেছে নেব। আপনি যদি এটির বিষয়ে চিন্তা করেন তবে আমরা সর্বোপরি নির্ভরতা ইনজেকশন দিয়ে আমরা অর্জন করি। আমরা কেবল কোনও বস্তুকে অবজেক্ট দেই।

$ উইন্ডো = নতুন উইন্ডো ();
$ দরজা = নতুন দরজা ();
$ ঘর = নতুন বাড়ি ($ উইন্ডো, $ দরজা);

এই ক্ষেত্রে, আমরা উইন্ডো অবজেক্টটি এবং ঘরের অবজেক্টটিতে দরজা অবজেক্টটি দেই।

অন্যদিকে, যদি আমাকে একক ক্রিয়া দিয়ে পরিষেবা লোকেটারের প্যাটার্নটি বর্ণনা করতে বলা হয় তবে আমি "নিতে" বলব। এটা আমার মনে হয়. আমরা যখন সার্ভিস লোকেটার ব্যবহার করি তখন আমরা এটিই করি। আমরা একটি বস্তু থেকে বস্তু গ্রহণ।

$ বাড়ী = $ serviceLocator-> get (বাড়ি :: শ্রেণি);

যেমন আপনি দেখতে পাচ্ছেন, আমরা পরিষেবাটি লোকেটার থেকে বাড়ির অবজেক্টটি নিই।

অনেক ক্ষেত্রে নির্ভরতা ইনজেকশন এবং পরিষেবা লোকেটার একক ইউনিট হিসাবে কাজ করে। জিনিসগুলি স্বয়ংক্রিয়ভাবে ইনজেকশনের সময় আমরা এটি দেখতে পাব না তবে দৃশ্যের পিছনে নির্ভরতা ইনজেকশন প্রয়োগগুলি প্রকৃত নির্ভরতা পুনরুদ্ধার করতে পরিষেবা লোকেদের উপর নির্ভর করে।

কোডের কোথাও এটি দেখতে কেমন লাগবে:

ভবিষ্যদ্বাণী ($ নির্ভরতা হিসাবে নির্ভরতা) {
    ances উদাহরণগুলি [] = $ এটি-> ধারক-> পান ($ নির্ভরতা);
}
ফিরুন $ this-> সমাধান ($ শ্রেণি, $ দৃষ্টান্ত);

একটি পরিষেবা লোকেটার প্রয়োগ করা বেশ সহজ। আপনার কেবলমাত্র নাম বা আইডি দ্বারা একটি অনুরোধ করা উদাহরণ পাওয়ার ক্ষমতা থাকা এবং অনুরোধকৃত উদাহরণটি আসলে উপস্থিত কিনা তা যাচাই করার ক্ষমতা থাকা দরকার। লক্ষণীয় যে কোনও পরিষেবা লোকেটারকে প্রায়শই একটি ধারক বলা হয়। দুটো জিনিসই এক। উভয়ই উদাহরণস্বরূপ বা পরিষেবাদি সরবরাহ করার জন্য বোঝানো হয় তবে আপনি তাদের কল করতে পছন্দ করেন। অবশ্যই, শর্তাদি এবং উদ্দেশ্যগুলি সম্পর্কে কথা বলার সময় কোনও পরিষেবা এবং উদাহরণের মধ্যে পার্থক্য রয়েছে তবে প্রযুক্তিগত দৃষ্টিকোণ থেকে এগুলি সমস্ত নির্দিষ্ট শ্রেণীর উদাহরণ।

এখানে কোনও পরিষেবা লোকেটারের একটি প্রাথমিক সংস্করণ (ওরফে ধারক):

ক্লাস সার্ভিস লোকেশন {

    ব্যক্তিগত $ পরিষেবাগুলি = [];

    পাবলিক ফাংশন পান (স্ট্রিং $ আইডি):? অবজেক্ট {
        ফিরতি $ এই-> পরিষেবাগুলি [$ আইডি] ?? খালি;
    }


    পাবলিক ফাংশনটিতে (স্ট্রিং $ আইডি) রয়েছে: বুল {
        রিটার্ন এসেট ($ এটি-> পরিষেবাগুলি [[আইডি]);
    }

    পাবলিক ফাংশন রেজিস্টার (স্ট্রিং $ আইডি, অবজেক্ট $ পরিষেবা): অকার্যকর {
        $ this-> পরিষেবাদি [$ id] = $ পরিষেবা;
    }
}
$ serviceLocator = নতুন সার্ভিস লোকেশন ();
$ serviceLocator-> নিবন্ধন ('বাড়ি', নতুন বাড়ি ());
// অন্য কোথাও

যদি ($ serviceLocator-> এর ('ঘর')) থাকে {
    $ ঘর = $ serviceLocator-> get ('ঘর');
}

অতিরিক্তভাবে, আমি পরিষেবাগুলি নিবন্ধ করার উপায় সরবরাহ করেছি।

নির্ভরতা ইনজেকশন বাস্তবায়ন স্বয়ংক্রিয়ভাবে বস্তুর মধ্যে নির্ভরতা ইনজেকশন। আপনার যা দরকার তা হল কিছুটা কনফিগারেশন সরবরাহ করা এবং এটিই। এটি অনেক ক্ষেত্রে বেশ সুবিধাজনক, তবে এমন অনেকগুলি ক্ষেত্রে রয়েছে যখন আপনাকে অচলাবস্থা এড়ানোর জন্য পরিষেবা লোকেটার ব্যবহার করতে হয়। এটি ঘটতে পারে যখন দুটি উদাহরণ কনস্ট্রাক্টরের মাধ্যমে একে অপরের উপর নির্ভর করে। এখানে একটি উদাহরণ:

শ্রেণীকক্ষে {
    
    পাবলিক ফাংশন __ কনস্ট্রাক্ট (বি $ বি)
    {
        //
    }
}

ক্লাস বি {
    পাবলিক ফাংশন __ কনস্ট্রাক্ট (এ $ এ)
    {
        //
    }
}
$ a = নতুন এ (...); // আমাদের বি দরকার!
$ খ = নতুন বি (...); // আমরা একটি প্রয়োজন!

যেমন আপনি দেখতে পাচ্ছেন, আমরা কোনও পরিষেবা সমাধান করতে পারি না কারণ সেগুলি একে অপরের উপর নির্ভরশীল। আমরা A কে পরিষেবাটি সমাধান করতে পারি না কারণ এর জন্য B এর পরিষেবা দরকার, এবং আমরা পরিষেবা বি সমাধান করতে পারি না কারণ এটির পরিষেবা দরকার A. এটি সমাধান করার জন্য আমাদের অলস-লোডিং পদ্ধতিতে পরিষেবাগুলির মধ্যে একটি উদ্ধার করতে হবে। এর অর্থ, যখন পরিষেবাটি প্রকৃত প্রয়োজন এবং কনস্ট্রাক্টরে নয় তখন আমাদের সেবার একটি সেবার লোকেশন থেকে নেওয়া উচিত।

সর্বেসর্বা

আশা করি এই নিবন্ধটি আপনার জন্য কিছু জিনিস পরিষ্কার করেছে এবং আপনি এটি পড়তে আনন্দিত হয়েছেন। যদি তা না হয় তবে অবশ্যই আপনাকে অবশ্যই আগে থেকেই বুদ্ধিমান প্রগ্রেমার হতে হবে ;-)