একটি নির্ভরতা হল একটি বস্তু যার উপর অন্য বস্তু নির্ভর করে। ডিপেনডেন্সি ইনজেকশন (বা ইনভার্সন) মূলত বস্তুগুলিকে সরবরাহ করে যা একটি বস্তুর প্রয়োজন, পরিবর্তে এটি বস্তুগুলিকে নিজেরাই তৈরি করে। এটি একটি দরকারী কৌশল যা পরীক্ষাকে সহজ করে তোলে, কারণ এটি আপনাকে নির্ভরতাকে উপহাস করতে দেয়৷
উদাহরণ স্বরূপ, যদি A ক্লাস B শ্রেণীতে একটি পদ্ধতিকে কল করে, যেটি C ক্লাসে একটি পদ্ধতিকে কল করে, তার মানে A B এর উপর নির্ভর করে এবং B C এর উপর নির্ভর করে। নির্ভরতা ইনজেকশন ব্যবহার করে, আমরা C এর একটি উদাহরণ B শ্রেণীতে পাস করতে পারি। , এবং B এবং C-এর দৃষ্টান্তগুলি তৈরি করতে এই শ্রেণীগুলি রাখার পরিবর্তে B-এর একটি উদাহরণ A শ্রেণীতে পাস করুন।
উদাহরণে, নীচে, ক্লাস রানারের ক্লাস লগারের উপর নির্ভরশীলতা রয়েছে। লক্ষ্য করুন যে ক্লাসে Runner কন্সট্রাক্টরে লগারের একটি উদাহরণ তৈরি করে। এই কোডে কিছু সমস্যা আছে।
-
এটি লগার ক্লাসকে রানারের সাথে সংযুক্ত করে এবং আমরা রানার পরিবর্তন না করে এটিকে অন্য ক্লাসের সাথে প্রতিস্থাপন করতে পারি না।
-
লগারের যদি কোনো নির্ভরতা থাকে, তাহলে কর্মীকে লগার ইনস্ট্যান্ট করার আগে সেগুলি কনফিগার করতে হবে।
-
পরীক্ষা করা কঠিন। লগার যদি একটি রিসোর্স-ইনটেনসিভ ক্লাস হয়, যেমন নেটওয়ার্ক বা ফাইল সিস্টেম অ্যাক্সেস করা, এটি পরীক্ষার গতি কমিয়ে দেবে। আমরা এটি সহজে প্রতিস্থাপন করতে পারি না।
using System; class Program{ static void Main(string[] args){ var runner = new Runner(); runner.Run(); } } class Runner{ private Logger _logger; public Runner(){ _logger = new Logger(); } public void Run(){ // Do some work _logger.Log("Message to be logged"); } } class Logger{ public void Log(string message){ Console.WriteLine(message); } }
নির্ভরতা ইনজেকশন ব্যবহার করে, আমরা একটি কংক্রিট বস্তুর পরিবর্তে একটি ইন্টারফেস ILogger গ্রহণ করতে Runner-এর কনস্ট্রাক্টরকে পরিবর্তন করি। ILogger বাস্তবায়ন করতে আমরা Logger ক্লাস পরিবর্তন করি। এটি আমাদের রানার কনস্ট্রাক্টরের কাছে লগার ক্লাসের একটি উদাহরণ প্রেরণ করতে দেয়। এর সুবিধা হল পরীক্ষার সময়, আমরা একটি TestLogger ক্লাস তৈরি করতে পারি যা ILogger প্রয়োগ করে এবং রানার কনস্ট্রাক্টরের কাছে পাস করে।
উদাহরণ
using System; class Program{ static void Main(string[] args){ var logger = new Logger(); var runner = new Runner(logger); runner.Run(); } } class Runner{ private ILogger _logger; public Runner(ILogger logger){ _logger = logger; } public void Run(){ // Do some work _logger.Log("Message to be logged"); } } interface ILogger{ void Log(string message); } class Logger : ILogger{ public void Log(string message){ Console.WriteLine(message); } }
আউটপুট
Message to be logged