Dependency Injection (DI) হল একটি ডিজাইন প্যাটার্ন যা আপনার অ্যাপ্লিকেশনের বিভিন্ন উপাদানগুলির মধ্যে ডিপেনডেন্সি (অর্থাৎ, এক উপাদান অন্যটির উপর নির্ভরশীল) সহজে এবং কার্যকরভাবে ম্যানেজ করার জন্য ব্যবহৃত হয়। DI এর মাধ্যমে, আপনি কম্পোনেন্টগুলির মধ্যে কমপ্লেক্স সম্পর্কগুলিকে আলাদা করতে পারেন, যা অ্যাপ্লিকেশনটিকে আরও মডুলার এবং টেস্টযোগ্য করে তোলে।
Dependency Injection-এর সাহায্যে, আপনি একাধিক ক্লাস এবং তাদের মধ্যে সম্পর্কের মধ্যে ইনজেকশন তৈরি করতে পারেন, যাতে কোডের পুনঃব্যবহারযোগ্যতা বৃদ্ধি পায় এবং অ্যাপ্লিকেশনটির কাঠামো উন্নত হয়।
এই টিউটোরিয়ালে Dependency Injection ব্যবহার করে একটি সিম্পল Application Structure তৈরি করার প্রক্রিয়া দেখানো হবে।
১. Dependency Injection কী?
Dependency Injection হল একটি প্রক্রিয়া যেখানে আপনার ক্লাসের ডিপেনডেন্সি (অথবা, যে ক্লাসগুলো আপনার ক্লাসের জন্য প্রয়োজন) সরাসরি ক্লাসের কনস্ট্রাক্টর, প্রপার্টি, অথবা ফিল্ডের মাধ্যমে সরবরাহ করা হয়। এর ফলে, আপনার ক্লাসগুলি স্বাধীনভাবে কাজ করতে পারে এবং ডিপেনডেন্সির জন্য একটি কেন্দ্রীয় উৎস ব্যবহার করতে পারে।
২. DI এর সুবিধা
- Loose Coupling: ক্লাসগুলির মধ্যে নির্ভরশীলতা কমিয়ে আনা।
- Testability: সহজেই মক/ফেক ডিপেনডেন্সি ইনজেক্ট করা যায়, যা ইউনিট টেস্টিং সহজ করে তোলে।
- Flexibility: সহজেই ডিপেনডেন্সি পরিবর্তন করা যায় বা কনফিগার করা যায়।
- Reusability: কোডের পুনঃব্যবহারযোগ্যতা বৃদ্ধি পায়।
৩. DI Container (Service Container) ব্যবহার করা
.NET (বা .NET Core) ফ্রেমওয়ার্কে, Microsoft.Extensions.DependencyInjection নামক একটি বিল্ট-ইন DI কন্টেইনার রয়েছে, যা DI কনফিগারেশন এবং ইনজেকশন পরিচালনা করে।
Step ১: .NET MAUI বা WPF অ্যাপ্লিকেশন তৈরি করুন
যেহেতু Dependency Injection সাধারণত .NET Core অথবা MAUI বা WPF অ্যাপ্লিকেশনগুলিতে ব্যবহৃত হয়, প্রথমে একটি .NET অ্যাপ্লিকেশন তৈরি করুন।
৪. DI কনফিগারেশন: WPF অ্যাপ্লিকেশন উদাহরণ
এই উদাহরণে, আমরা একটি সিম্পল WPF অ্যাপ্লিকেশন তৈরি করব, যেখানে DI ব্যবহৃত হবে ডিপেনডেন্সি ইনজেকশন কনফিগারেশনের জন্য।
Step ২: Project Setup
- Visual Studio-তে একটি WPF Application তৈরি করুন।
- Microsoft.Extensions.DependencyInjection প্যাকেজটি ইনস্টল করুন:
Install-Package Microsoft.Extensions.DependencyInjection
Step ৩: Service Registration
এখন, WPF অ্যাপ্লিকেশনটিতে DI কনফিগার করতে হবে।
Services ফোল্ডার তৈরি করুন এবং একটি ইন্টারফেস এবং ক্লাস তৈরি করুন:
- IMessageService.cs (ইন্টারফেস)
public interface IMessageService { string GetMessage(); }- MessageService.cs (ক্লাস)
public class MessageService : IMessageService { public string GetMessage() { return "Hello from Dependency Injection!"; } }- App.xaml.cs (Main Application Entry) কনফিগারেশনের জন্য:
using Microsoft.Extensions.DependencyInjection;
using System.Windows;
namespace WpfAppWithDI
{
public partial class App : Application
{
public static IServiceProvider ServiceProvider { get; private set; }
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
// DI কনফিগারেশন
var serviceCollection = new ServiceCollection();
ConfigureServices(serviceCollection);
ServiceProvider = serviceCollection.BuildServiceProvider();
var mainWindow = ServiceProvider.GetRequiredService<MainWindow>();
mainWindow.Show();
}
private void ConfigureServices(ServiceCollection services)
{
// IService, IMessageService ইত্যাদি ইনজেক্ট করা
services.AddSingleton<IMessageService, MessageService>();
services.AddSingleton<MainWindow>();
}
}
}
Step ৪: WPF MainWindow সেটআপ
এখন, MainWindow.xaml.cs-এ DI কনফিগার করে IMessageService ইনজেক্ট করা হবে:
using System.Windows;
namespace WpfAppWithDI
{
public partial class MainWindow : Window
{
private readonly IMessageService _messageService;
public MainWindow(IMessageService messageService)
{
_messageService = messageService;
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
// MessageService এর মাধ্যমে মেসেজ দেখানো
MessageBox.Show(_messageService.GetMessage());
}
}
}
Step ৫: MainWindow.xaml
<Window x:Class="WpfAppWithDI.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="WPF with DI" Height="350" Width="525">
<Grid>
<Button Content="Show Message" HorizontalAlignment="Center" VerticalAlignment="Center" Width="200" Height="50" Click="Button_Click"/>
</Grid>
</Window>
ব্যাখ্যা:
- IServiceProvider: এটি ServiceCollection থেকে তৈরি করা হয় এবং সমস্ত ডিপেনডেন্সি ম্যানেজ করে।
- AddSingleton<IMessageService, MessageService>: এখানে আমরা MessageService ক্লাসটি IMessageService ইন্টারফেসের সাথে যুক্ত করছি, যাতে যখনই IMessageService ইনজেক্ট করা হবে, এটি MessageService দিয়ে ডিপেন্ড করবে।
৫. DI ব্যবহার করে Testable Architecture
DI ব্যবহার করে অ্যাপ্লিকেশনের কোড টেস্ট করা আরও সহজ হয়। এক্ষেত্রে, আপনি সহজেই Mock বা Fake সেবা ইনজেক্ট করতে পারেন, যা ইউনিট টেস্টিং সহজ করে।
উদাহরণ: Test Class
public class MockMessageService : IMessageService
{
public string GetMessage()
{
return "Mocked Message";
}
}
এখন আপনি MockMessageService ব্যবহার করে ইউনিট টেস্ট তৈরি করতে পারবেন, যেখানে বাস্তব MessageService ব্যবহার না করে মক সার্ভিসটি ব্যবহার হবে।
উপসংহার
Dependency Injection (DI) ব্যবহার করে আপনি Windows Applications (যেমন WPF, WinUI 3) এর মধ্যে অ্যাপ্লিকেশনের কাঠামো উন্নত এবং মডুলার করতে পারেন। এটি loose coupling এবং testability এর জন্য খুবই গুরুত্বপূর্ণ, যেখানে আপনি বিভিন্ন সার্ভিস এবং ডিপেনডেন্সি সঠিকভাবে ইনজেক্ট করতে পারেন।
DI Container (যেমন Microsoft.Extensions.DependencyInjection) ব্যবহার করে আপনি আপনার অ্যাপ্লিকেশনটি আরও পরিষ্কার এবং সহজে পরিচালনা করতে পারেন, এবং এর মাধ্যমে কোডের পুনঃব্যবহারযোগ্যতা এবং টেস্টিং সহজ হয়ে ওঠে।
Read more