Dependency Injection (DI) হলো একটি ডিজাইন প্যাটার্ন যা ডিপেনডেন্সিগুলো (যেমন ক্লাস, সার্ভিস, বা অবজেক্ট) অন্য ক্লাসে ইনজেক্ট করার একটি কার্যকর পদ্ধতি। এটি ASP.NET Core-এর একটি বিল্ট-ইন ফিচার এবং অ্যাপ্লিকেশনের কোডকে আরও মডুলার, টেস্টেবল এবং মেইনটেনযোগ্য করে তোলে।
ASP.NET Core-এ DI ব্যবহার করা হয় সার্ভিস রেজিস্ট্রেশন এবং রিজলিউশন পরিচালনা করতে, যা অ্যাপ্লিকেশনের বিভিন্ন কম্পোনেন্টের মধ্যে ডিপেনডেন্সিগুলো সহজে যোগসূত্র স্থাপন করে।
DI মূলত তিনটি গুরুত্বপূর্ণ ধারণার উপর ভিত্তি করে কাজ করে:
Dependency হলো একটি ক্লাসের এমন কোনো অবজেক্ট বা সার্ভিস, যা সেই ক্লাসে ব্যবহৃত হয়।
Injection হলো সেই প্রক্রিয়া, যেখানে ডিপেনডেন্সি সরাসরি কোনো ক্লাসের মধ্যে তৈরি না করে বাইরের একটি উৎস থেকে সরবরাহ করা হয়।
IoC মানে ক্লাস নিজে ডিপেনডেন্সি তৈরি না করে এটি কোনো বহিরাগত উৎস থেকে সরবরাহ পায়।
ASP.NET Core-এ DI কাজ করার জন্য একটি IoC Container বা Service Container ব্যবহার করা হয়। এই কন্টেইনার তিনটি ধাপে কাজ করে:
ASP.NET Core-এ DI তিন ধরনের লাইফটাইম সমর্থন করে:
একটি সার্ভিস অ্যাপ্লিকেশন লাইফটাইম জুড়ে একবারই তৈরি হয় এবং সবার জন্য একই থাকে।
একটি সার্ভিস প্রতিটি HTTP রিকোয়েস্টের জন্য একবার তৈরি হয়।
একটি সার্ভিস প্রতিবার ডিপেনডেন্সি রিকোয়েস্টের সময় নতুনভাবে তৈরি হয়।
ASP.NET Core-এ ডিপেনডেন্সি কনটেইনারে সার্ভিস রেজিস্টার করার জন্য Startup.cs
ফাইলের ConfigureServices
মেথড ব্যবহার করা হয়।
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IMyService, MyService>();
services.AddScoped<IOtherService, OtherService>();
services.AddTransient<IAnotherService, AnotherService>();
}
Service Resolution সাধারণত কনস্ট্রাক্টর ইনজেকশন ব্যবহার করে করা হয়।
public class HomeController : Controller
{
private readonly IMyService _myService;
public HomeController(IMyService myService)
{
_myService = myService;
}
public IActionResult Index()
{
var data = _myService.GetData();
return View(data);
}
}
// Interface
public interface IMyService
{
string GetData();
}
// Implementation
public class MyService : IMyService
{
public string GetData()
{
return "Hello from MyService!";
}
}
ASP.NET Core অনেক বিল্ট-ইন সার্ভিস সরবরাহ করে, যা DI ব্যবহার করে রেজিস্টার করা যায়। উদাহরণ:
ILogger<T>
: লগিং ব্যবস্থাপনার জন্য।IConfiguration
: অ্যাপ্লিকেশন কনফিগারেশন পরিচালনার জন্য।IHttpClientFactory
: HTTP ক্লায়েন্ট তৈরি এবং পরিচালনার জন্য।public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddHttpClient();
services.AddLogging();
}
Dependency Injection (DI) ASP.NET Core-এর একটি শক্তিশালী ফিচার, যা অ্যাপ্লিকেশনকে মডুলার, টেস্টেবল এবং সহজে পরিচালনাযোগ্য করে তোলে। DI ব্যবহার করে আপনি সার্ভিসের ডিপেনডেন্সি সহজে হ্যান্ডেল করতে পারবেন এবং অ্যাপ্লিকেশনের গুণগত মান বাড়াতে পারবেন।
Dependency Injection (DI) হলো একটি ডিজাইন প্যাটার্ন, যা অ্যাপ্লিকেশনের বিভিন্ন ক্লাস এবং অবজেক্টের মধ্যে ডিপেনডেন্সিগুলো পরিচালনা করতে ব্যবহৃত হয়। এটি একটি ক্লাসের নির্ভরশীলতা (Dependency) সরাসরি সেই ক্লাসের মধ্যে তৈরি না করে বাইরে থেকে সরবরাহ করার পদ্ধতি। DI এর মাধ্যমে কোড আরও মডুলার, পুনর্ব্যবহারযোগ্য এবং টেস্টযোগ্য হয়।
Dependency হলো একটি ক্লাসের এমন কোনো অবজেক্ট বা সার্ভিস, যা সেই ক্লাসের কার্য সম্পাদনে প্রয়োজন হয়। উদাহরণস্বরূপ, একটি ক্লাস যদি ডেটা রিটার্ন করার জন্য অন্য একটি ক্লাসের ওপর নির্ভরশীল হয়, তবে সেই ক্লাসটি তার Dependency।
public class DataProcessor
{
private DatabaseService _dbService;
public DataProcessor()
{
_dbService = new DatabaseService(); // Dependency
}
}
উপরের কোডে DataProcessor
ক্লাস সরাসরি DatabaseService
তৈরি করছে, যা সরাসরি ডিপেনডেন্সি তৈরি করার উদাহরণ।
Injection হলো ডিপেনডেন্সি সরাসরি ক্লাসের মধ্যে তৈরি না করে, এটি বাইরে থেকে সরবরাহ করার প্রক্রিয়া।
public class DataProcessor
{
private readonly DatabaseService _dbService;
public DataProcessor(DatabaseService dbService) // Dependency Injected
{
_dbService = dbService;
}
}
উপরের উদাহরণে, DatabaseService
অবজেক্টটি কনস্ট্রাক্টরের মাধ্যমে সরবরাহ করা হয়েছে। এটি DI এর একটি উদাহরণ।
DI মূলত Inversion of Control (IoC) এর বাস্তবায়ন। IoC মানে ক্লাস নিজে তার নির্ভরশীলতা নিয়ন্ত্রণ না করে তা বাইরে থেকে সরবরাহ করা হয়। IoC Container বা Service Container এই দায়িত্ব পালন করে।
Dependency সরবরাহ করার জন্য কনস্ট্রাক্টর ব্যবহার করা হয়। এটি সবচেয়ে সাধারণ এবং জনপ্রিয় পদ্ধতি।
public class DataProcessor
{
private readonly IDataService _dataService;
public DataProcessor(IDataService dataService)
{
_dataService = dataService;
}
}
Dependency সরবরাহ করার জন্য একটি Public Property ব্যবহার করা হয়।
public class DataProcessor
{
public IDataService DataService { get; set; }
}
Dependency সরবরাহ করার জন্য একটি মেথড ব্যবহার করা হয়।
public class DataProcessor
{
public void ProcessData(IDataService dataService)
{
dataService.GetData();
}
}
public class DataProcessor
{
private DatabaseService _dbService = new DatabaseService();
public void ProcessData()
{
_dbService.SaveData();
}
}
এখানে DataProcessor
সরাসরি DatabaseService
তৈরি করছে, যা Tightly Coupled ডিজাইন।
public class DataProcessor
{
private readonly IDatabaseService _dbService;
public DataProcessor(IDatabaseService dbService)
{
_dbService = dbService;
}
public void ProcessData()
{
_dbService.SaveData();
}
}
এখানে IDatabaseService
ইন্টারফেস ব্যবহার করে Dependency Inject করা হয়েছে, যা Loosely Coupled ডিজাইন।
Dependency Injection একটি শক্তিশালী ডিজাইন প্যাটার্ন, যা ASP.NET Core এর কোডিং স্ট্যান্ডার্ড এবং আর্কিটেকচারে একটি গুরুত্বপূর্ণ ভূমিকা পালন করে। এটি অ্যাপ্লিকেশনকে মডুলার, স্কেলেবল এবং টেস্টযোগ্য করে তোলে।
ASP.NET Core-এ Dependency Injection (DI) একটি গুরুত্বপূর্ণ বৈশিষ্ট্য, যা কোডের পুনঃব্যবহারযোগ্যতা, পরীক্ষাযোগ্যতা এবং রক্ষণাবেক্ষণযোগ্যতা উন্নত করে। DI হল একটি ডিজাইন প্যাটার্ন যেখানে ক্লাসগুলোর মধ্যে ডিপেনডেন্সি বা নির্ভরতাগুলি বাইরের উৎস থেকে ইনজেক্ট করা হয়, যা একে খুবই নমনীয় এবং কার্যকরী করে তোলে।
ASP.NET Core-এ Dependency Injection প্রাথমিকভাবে বিল্ট-ইন সমর্থন সহ আসে, এবং এটি খুব সহজেই কনফিগার করা যায়।
Dependency Injection হচ্ছে একটি প্যাটার্ন যার মাধ্যমে ক্লাসের মধ্যে নির্ভরতাগুলি সরাসরি তৈরি না করে বাহ্যিকভাবে (অথবা ইনজেকশনের মাধ্যমে) ইনজেক্ট করা হয়। এর মাধ্যমে কোডের মডুলারিটি বাড়ানো হয় এবং কোডের বিভিন্ন অংশের মধ্যে কম্প্লেক্সিটির স্তর কমানো হয়।
ASP.NET Core-এ DI কনফিগার করা অত্যন্ত সহজ এবং এটি Startup.cs বা Program.cs ফাইলে ইনজেকশন কনফিগার করা হয়।
প্রথমে একটি ইন্টারফেস এবং সেই ইন্টারফেসের জন্য একটি ইমপ্লিমেন্টেশন তৈরি করতে হবে। উদাহরণস্বরূপ:
// Service Interface
public interface IMessageService
{
string GetMessage();
}
// Service Implementation
public class MessageService : IMessageService
{
public string GetMessage()
{
return "Hello from Dependency Injection!";
}
}
DI কনফিগার করতে, আপনাকে ConfigureServices মেথডে সেবাটি রেজিস্টার করতে হবে। এটি সাধারণত Startup.cs বা Program.cs ফাইলে করা হয়।
Program.cs ফাইলে DI কনফিগারেশন:
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) =>
{
services.AddSingleton<IMessageService, MessageService>();
// অন্যান্য সেবাগুলিও এখানে রেজিস্টার করুন
});
}
এখানে, AddSingleton<IMessageService, MessageService>() সেবাটিকে Singleton লাইফটাইম হিসেবে রেজিস্টার করছে। এটি মানে একবার সেবা তৈরি হলে তা পুরো অ্যাপ্লিকেশনজুড়ে একটাই ইনস্ট্যান্স ব্যবহৃত হবে।
আপনি আরও কয়েকটি লাইফটাইম অপশন ব্যবহার করতে পারেন:
এখন, যেখানে আপনি সেবা প্রয়োজন, সেখানে সেই সেবাটি ইনজেক্ট করতে হবে। উদাহরণস্বরূপ, একটি কন্ট্রোলার ক্লাসে এই সেবাটি ইনজেক্ট করা:
public class HomeController : Controller
{
private readonly IMessageService _messageService;
// Constructor Dependency Injection
public HomeController(IMessageService messageService)
{
_messageService = messageService;
}
public IActionResult Index()
{
ViewData["Message"] = _messageService.GetMessage();
return View();
}
}
এখানে, IMessageService কনস্ট্রাক্টরের মাধ্যমে ইনজেক্ট করা হয়েছে। ASP.NET Core স্বয়ংক্রিয়ভাবে MessageService ইনস্ট্যান্সটি প্রদান করবে, যেহেতু এটি DI কনটেইনারে রেজিস্টার করা হয়েছে।
আপনার অ্যাপ্লিকেশনে HomeController যেমন যেকোনো ক্লাসে DI সেবা ব্যবহার করতে পারেন। ASP.NET Core তার নিজস্ব DI কনটেইনার ব্যবহার করে এই সেবাগুলো ইনজেক্ট করে দেয়।
DI সেবাগুলো বিভিন্ন লাইফটাইমে রেজিস্টার করা যেতে পারে। প্রতিটি লাইফটাইমের বিশেষ উদ্দেশ্য রয়েছে:
Singleton: এই লাইফটাইমে রেজিস্টার করা সেবা অ্যাপ্লিকেশনের শুরু থেকে শেষ পর্যন্ত একটি ইনস্ট্যান্স হিসেবে কাজ করে। এটি কম্পনেন্টের মধ্যে শেয়ারড ডেটা বা অবস্থান ধারণ করতে পারে।
services.AddSingleton<IMessageService, MessageService>();
Scoped: এই সেবাটি একটি নির্দিষ্ট স্কোপে কাজ করে, সাধারণত HTTP রিকোয়েস্টের সাথে সম্পর্কিত। একটি HTTP রিকোয়েস্টের জন্য একটি ইনস্ট্যান্স তৈরি হবে এবং এটি সেই রিকোয়েস্টের মধ্যে সীমাবদ্ধ থাকবে।
services.AddScoped<IMessageService, MessageService>();
Transient: এই সেবাটি প্রতি ডিপেনডেন্সি রেজিস্ট্রেশন বা ইনজেকশন এ একটি নতুন ইনস্ট্যান্স তৈরি করবে।
services.AddTransient<IMessageService, MessageService>();
ASP.NET Core-এ Dependency Injection (DI) ব্যবহার করে অ্যাপ্লিকেশনের কোডের পুনঃব্যবহারযোগ্যতা, টেস্টযোগ্যতা এবং রক্ষণাবেক্ষণযোগ্যতা উন্নত করা সম্ভব। DI কনফিগারেশন খুবই সহজ এবং এটি স্বয়ংক্রিয়ভাবে সেবাগুলো ইনজেক্ট করে দেয়, যা কোডের কার্যকারিতা এবং নমনীয়তা বাড়ায়। DI-র মাধ্যমে ASP.NET Core আরও শক্তিশালী এবং মডুলার অ্যাপ্লিকেশন তৈরি করতে সহায়তা করে।
ASP.NET Core-এ Dependency Injection (DI) একটি গুরুত্বপূর্ণ কনসেপ্ট, যা অ্যাপ্লিকেশনের ডিপেনডেন্সি ম্যানেজমেন্ট সহজ করে এবং কোডের পুনরায় ব্যবহারযোগ্যতা বাড়ায়। DI এর মাধ্যমে, আপনি বিভিন্ন সার্ভিস ক্লাসকে একসাথে সংযুক্ত করতে পারেন, যেগুলোর লাইফটাইম ম্যানেজ করা যায়। ASP.NET Core-এ তিনটি প্রধান সার্ভিস লাইফটাইম রয়েছে: Scoped, Transient, এবং Singleton। এগুলোর ব্যবহার অ্যাপ্লিকেশনের কাঠামো এবং পারফরম্যান্সের ওপর প্রভাব ফেলে।
Scoped লাইফটাইমে একটি সার্ভিস প্রতিটি HTTP রিকোয়েস্ট এর জন্য একবার তৈরি হয় এবং সেই রিকোয়েস্ট চলাকালীন সার্ভিসটি পুনরায় ব্যবহার করা হয়। এই লাইফটাইমটি সাধারণত ডেটাবেস সংযোগ বা অন্য কোনো রিকোয়েস্ট-বেসড সার্ভিসের জন্য ব্যবহার করা হয়।
Scoped সার্ভিস শুধুমাত্র একটি নির্দিষ্ট রিকোয়েস্টের মধ্যে জীবিত থাকে এবং যখন রিকোয়েস্ট শেষ হয়ে যায়, তখন এটি ধ্বংস হয়ে যায়। এটি সাধারণত Controller বা Middleware-এর মতো রিকোয়েস্ট ভিত্তিক সার্ভিসে ব্যবহৃত হয়।
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<IMyService, MyService>();
}
এখানে, IMyService
ইন্টারফেসের একটি ইন্সট্যান্স প্রতিটি HTTP রিকোয়েস্টের জন্য নতুনভাবে তৈরি হবে এবং রিকোয়েস্টের জন্য ব্যবহৃত হবে।
Transient লাইফটাইমে একটি সার্ভিস প্রতিটি Dependency Injection কলের জন্য নতুনভাবে তৈরি হয়। প্রতিবার একটি নতুন ইন্সট্যান্স তৈরি হবে, এবং এটি যতবারই ডিপেনডেন্সি ইনজেক্ট করা হোক না কেন, প্রতিবারই এটি নতুন হবে।
Transient সার্ভিসটি সাধারণত ছোট, স্বতন্ত্র এবং পরিবর্তনযোগ্য ডেটা বা কর্মক্ষমতা পরিচালনা করে, যেমন লগিং সার্ভিস, ক্লায়েন্ট-কনফিগার করা সার্ভিস ইত্যাদি।
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<IMyService, MyService>();
}
এখানে, IMyService
প্রতিবার সার্ভিস প্রয়োজন হলে, একেবারে নতুন একটি ইন্সট্যান্স তৈরি হবে। এটি সাধারণত সেই সার্ভিসে ব্যবহার হয়, যেগুলো একটি রিকোয়েস্টের মধ্যে একাধিকবার ব্যবহৃত হতে পারে।
Singleton লাইফটাইমে একটি সার্ভিস অ্যাপ্লিকেশন শুরু হওয়ার পর থেকে অ্যাপ্লিকেশন চলাকালীন পুরো সময় জুড়ে একবার তৈরি হয় এবং একটি একই ইন্সট্যান্স সকল জায়গায় ব্যবহৃত হয়। এটি সাধারণত সেই সার্ভিসে ব্যবহৃত হয় যেগুলো ডেটা শেয়ার করতে হয় বা দীর্ঘমেয়াদী সংযোগ রাখতে হয়।
Singleton সার্ভিসটি দীর্ঘস্থায়ী অবস্থায় থাকে এবং অ্যাপ্লিকেশন চলাকালীন একমাত্র ইন্সট্যান্স ব্যবহৃত হয়, যেমন কনফিগারেশন সার্ভিস, লগিং সার্ভিস বা এমন কোনো সার্ভিস যেটি খুব কম সময়ে বা কখনও নতুনভাবে তৈরি করা প্রয়োজন হয় না।
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IMyService, MyService>();
}
এখানে, IMyService
কেবল একবার তৈরি হবে এবং অ্যাপ্লিকেশন চলাকালীন পুরো সময় একক ইন্সট্যান্সের মাধ্যমে ব্যবহৃত হবে।
লাইফটাইম | সার্ভিসের অবস্থা | এক্সটেনশন | উপযুক্ত পরিস্থিতি |
---|---|---|---|
Scoped | রিকোয়েস্ট-ভিত্তিক | এক রিকোয়েস্টের মধ্যে একবার তৈরি হয় | রিকোয়েস্ট ভিত্তিক ডেটা যেমন ডাটাবেস কানেকশন, ইউজার সেশন |
Transient | একবার ব্যবহার হওয়া | প্রতিবার নতুনভাবে তৈরি হয় | ছোট, অস্থায়ী সার্ভিস যেমন ডেটা প্রসেসিং, ইউটিলিটি সার্ভিস |
Singleton | অ্যাপ্লিকেশন চলাকালীন একটিই | অ্যাপ্লিকেশন চলাকালীন একটাই ইন্সট্যান্স | কনফিগারেশন, লগিং, এবং এমন সার্ভিস যা একাধিক জায়গায় শেয়ার করা হয় |
ASP.NET Core এর Dependency Injection লাইফটাইম গুলি - Scoped, Transient, এবং Singleton - প্রতিটির নিজস্ব ব্যবহারের ক্ষেত্র রয়েছে। একটি সঠিক লাইফটাইম নির্বাচন করা আপনার অ্যাপ্লিকেশনের পারফরম্যান্স এবং কোডের সুসংগঠনকে শক্তিশালী করতে সহায়ক।
ASP.NET Core-এ Dependency Injection (DI) একটি বিল্ট-ইন ফিচার, যা কোডের রিইউজেবিলিটি এবং টেস্টেবিলিটি নিশ্চিত করতে সাহায্য করে। Custom Service তৈরি এবং DI এর মাধ্যমে তা ব্যবহার করা ASP.NET Core অ্যাপ্লিকেশনে সাধারণ একটি প্রক্রিয়া। এখানে ধাপে ধাপে Custom Service তৈরি এবং তা DI এর মাধ্যমে ব্যবহার করার পদ্ধতি ব্যাখ্যা করা হলো।
Custom Service হলো এমন একটি ক্লাস, যা নির্দিষ্ট একটি ফিচার বা কার্য সম্পাদনের জন্য ডিজাইন করা হয়।
প্রথমে একটি ইন্টারফেস তৈরি করুন, যা Service এর ফাংশনালিটিগুলো ডিফাইন করবে।
public interface ICustomService
{
string GetMessage();
}
এরপর ইন্টারফেসটি ইমপ্লিমেন্ট করে একটি ক্লাস তৈরি করুন, যেখানে সুনির্দিষ্ট ফাংশনালিটি প্রদান করা হবে।
public class CustomService : ICustomService
{
public string GetMessage()
{
return "Hello from Custom Service!";
}
}
ASP.NET Core-এ Startup.cs
ফাইলের ConfigureServices
মেথডে Custom Service রেজিস্টার করতে হবে।
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
// Custom Service রেজিস্ট্রেশন
services.AddTransient<ICustomService, CustomService>();
}
Transient: প্রতি রিকোয়েস্টে নতুন ইনস্ট্যান্স তৈরি হয়।
services.AddTransient<ICustomService, CustomService>();
Scoped: প্রতি রিকোয়েস্টে একটি ইনস্ট্যান্স তৈরি হয় এবং এটি রিকোয়েস্ট শেষ হওয়া পর্যন্ত থাকে।
services.AddScoped<ICustomService, CustomService>();
Singleton: পুরো অ্যাপ্লিকেশন জুড়ে একটি মাত্র ইনস্ট্যান্স ব্যবহার হয়।
services.AddSingleton<ICustomService, CustomService>();
Custom Service-কে একটি Controller-এ ব্যবহার করতে চাইলে Constructor Injection ব্যবহার করতে হবে।
public class HomeController : Controller
{
private readonly ICustomService _customService;
public HomeController(ICustomService customService)
{
_customService = customService;
}
public IActionResult Index()
{
var message = _customService.GetMessage();
ViewData["Message"] = message;
return View();
}
}
Controller থেকে ডেটা ভিউতে পাঠানো হয়েছে। এখন এই ডেটা ভিউতে প্রদর্শিত হবে।
<h1>@ViewData["Message"]</h1>
Custom Service এর ফাংশনালিটি টেস্ট করার জন্য Mocking Framework ব্যবহার করা যেতে পারে, যেমন Moq।
[Fact]
public void Test_CustomService()
{
var mockService = new Mock<ICustomService>();
mockService.Setup(service => service.GetMessage()).Returns("Test Message");
var controller = new HomeController(mockService.Object);
var result = controller.Index() as ViewResult;
Assert.Equal("Test Message", result.ViewData["Message"]);
}
Custom Service তৈরি এবং DI এর মাধ্যমে তা ব্যবহার করা ASP.NET Core অ্যাপ্লিকেশনে কোড মেইনটেনেন্স এবং স্কেলেবিলিটির জন্য অত্যন্ত কার্যকর। Custom Service-কে DI Container-এ রেজিস্টার করার পর এটি সহজেই অ্যাপ্লিকেশনের যেকোনো স্থানে ইনজেক্ট করা যায়। এটি অ্যাপ্লিকেশনের মডুলার আর্কিটেকচার নিশ্চিত করে এবং টেস্টেবিলিটি বাড়ায়।
common.read_more