কম্পিউটার টিউটোরিয়াল

C#-এ ডিপেন্ডেন্সি ইনজেকশন ব্যাখ্যা


একটি ডিপেন্ডেন্সি হলো এমন একটি অবজেক্ট যা অন্য একটি অবজেক্টের উপর নির্ভরশীল। ডিপেন্ডেন্সি ইনজেকশন (বা ইনভার্সন) মূলত সেই অবজেক্টগুলো সরবরাহ করা যা একটি অবজেক্টের প্রয়োজন, বরং সেই অবজেক্টটি নিজে নিজে সেগুলো কনস্ট্রাক্ট করবে। এটি একটি উপকারী কৌশল যা টেস্টিংকে সহজ করে তোলে, কারণ এটি ডিপেন্ডেন্সিগুলো মক করার অনুমতি দেয়।

উদাহরণস্বরূপ, যদি ক্লাস A ক্লাস B-র একটি মেথড কল করে, যা আবার ক্লাস C-র একটি মেথড কল করে, তবে এর মানে A, B-র ওপর নির্ভরশীল এবং B, C-র ওপর নির্ভরশীল। ডিপেন্ডেন্সি ইনজেকশন ব্যবহার করে, আমরা ক্লাস C-র একটি ইনস্ট্যান্স ক্লাস B-তে পাস করতে পারি, এবং ক্লাস B-র একটি ইনস্ট্যান্স ক্লাস A-তে পাস করতে পারি, বরং এই ক্লাসগুলো নিজেদের B ও C-র ইনস্ট্যান্স কনস্ট্রাক্ট করবে।

নিচের উদাহরণে, Runner ক্লাসের Logger ক্লাসের ওপর একটি ডিপেন্ডেন্সি আছে। লক্ষ্য করুন Runner ক্লাস কনস্ট্রাক্টরে Logger-র একটি ইনস্ট্যান্স তৈরি করছে। এই কোডে কয়েকটি সমস্যা আছে।

  • এটি Logger ক্লাসকে Runner-র সাথে বাঁধিয়ে দেয় এবং Runner মডিফাই না করলে অন্য ক্লাস দিয়ে সাবস্টিটিউট করা সম্ভব নয়।

  • যদি Logger-এর কোনো ডিপেন্ডেন্সি থাকে, তবে Worker-কে Logger ইনস্ট্যানশিয়েট করার আগে সেগুলো কনফিগার করতে হবে।

  • টেস্টিং কঠিন হয়। যদি Logger একটি রিসোর্স-ইনটেনসিভ ক্লাস হয়, যেমন নেটওয়ার্ক বা ফাইল সিস্টেম এক্সেস করা, তবে টেস্টিং ধীর হয়ে যাবে। আমরা সহজে সেটি রিপ্লেস করতে পারবো না।

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);    } }

ডিপেন্ডেন্সি ইনজেকশন ব্যবহার করে, আমরা Runner-এর কনস্ট্রাক্টরকে মডিফাই করি যাতে এটি একটি কনক্রিট অবজেক্টের বদলে ILogger ইন্টারফেস এক্সেপ্ট করে। আমরা Logger ক্লাসকে পরিবর্তন করি যাতে এটি ILogger ইমপ্লিমেন্ট করে। এটি আমাদের Logger ক্লাসের একটি ইনস্ট্যান্স Runner-এর কনস্ট্রাক্টরে পাস করার অনুমতি দেয়। এর সুবিধা হলো টেস্টিং-এর সময়, আমরা ILogger ইমপ্লিমেন্ট করা একটি TestLogger ক্লাস তৈরি করে Runner-এর কনস্ট্রাক্টরে পাস করতে পারি।

উদাহরণ

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

  1. C#-তে ক্লাস কনসেপ্ট ব্যাখ্যা

  2. C# Console ক্লাস

  3. পাইথনে অবজেক্ট কি? উদাহরণসহ ব্যাখ্যা

  4. Ruby কোড ডিকাপলিং: ডেলিগেশন বনাম ডিপেন্ডেন্সি ইনজেকশন