Guice Dependency Injection Framework-এ Complex Data Structures এর জন্য Multibindings কনফিগার করা একটি শক্তিশালী বৈশিষ্ট্য। Multibindings আপনাকে একই টাইপের একাধিক ইন্টান্স একসাথে বাইনড করার সুযোগ দেয়। এটি বিশেষত তখন উপকারী হয় যখন আপনাকে একটি কাস্টম ডেটা স্ট্রাকচার (যেমন একটি কাস্টম List, Map, Set ইত্যাদি) তৈরি করতে হয়, যেখানে একাধিক ভিন্ন ভিন্ন উপাদান যুক্ত করা যায়।
Guice আপনাকে Multibinder অথবা MapBinder ব্যবহার করে একাধিক উপাদান বা ডিপেন্ডেন্সি যুক্ত করতে দেয়।
Multibindings in Guice
Guice এর Multibindings-এর দুটি প্রধান উপাদান রয়েছে:
- Multibinder – একাধিক উপাদান একই টাইপের কন্টেইনারে যুক্ত করার জন্য।
- MapBinder – Key-Value পেয়ার হিসেবে একাধিক উপাদান বাইনড করার জন্য।
Multibindings ব্যবহার করে Complex Data Structure কনফিগার করা
আমরা দুটি ধরনের ডেটা স্ট্রাকচার নিয়ে উদাহরণ দেখাব:
- List বা Set (যেখানে একাধিক উপাদান রাখা হবে)
- Map (Key-Value পেয়ার)
1. List বা Set এর জন্য Multibindings
ধরা যাক, আপনি একটি List<String> তৈরি করতে চান, যেখানে একাধিক String আইটেম থাকবে এবং এগুলোর ইনজেকশন করা হবে।
Step 1: Guice Module Configuration
Multibinder ব্যবহার করে একই টাইপের একাধিক উপাদান যুক্ত করুন।
import com.google.inject.AbstractModule;
import com.google.inject.multibindings.Multibinder;
public class MyModule extends AbstractModule {
@Override
protected void configure() {
// Create a Multibinder for String
Multibinder<String> stringBinder = Multibinder.newSetBinder(binder(), String.class);
// Bind multiple instances to the Multibinder
stringBinder.addBinding().toInstance("Hello");
stringBinder.addBinding().toInstance("Guice");
stringBinder.addBinding().toInstance("Multibindings");
}
}
এখানে, Multibinder.newSetBinder ব্যবহার করে একটি Set<String> তৈরি করা হয়েছে। এর পরে, addBinding().toInstance("value") ব্যবহার করে একাধিক String মান যুক্ত করা হয়েছে।
Step 2: Injecting the List or Set
এখন, List<String> বা Set<String> ইনজেক্ট করতে, আপনার ক্লাসে @Inject ব্যবহার করুন:
import com.google.inject.Inject;
import java.util.Set;
public class MyApplication {
private final Set<String> myStrings;
@Inject
public MyApplication(Set<String> myStrings) {
this.myStrings = myStrings;
}
public void printStrings() {
for (String str : myStrings) {
System.out.println(str);
}
}
public static void main(String[] args) {
Injector injector = Guice.createInjector(new MyModule());
MyApplication app = injector.getInstance(MyApplication.class);
app.printStrings();
}
}
এখানে, Guice Set<String> ইনজেক্ট করবে, যেখানে Hello, Guice, এবং Multibindings মানগুলো আগে থেকেই যোগ করা ছিল।
Output:
Hello
Guice
Multibindings
2. Map (Key-Value Pair) এর জন্য Multibindings
MapBinder ব্যবহার করে আপনি Map ডেটা স্ট্রাকচার তৈরি করতে পারেন, যেখানে Key-Value পেয়ার থাকবে।
Step 1: Guice Module Configuration for Map
এখন, একটি Map<String, Integer> কনফিগার করতে MapBinder ব্যবহার করা হবে।
import com.google.inject.AbstractModule;
import com.google.inject.multibindings.MapBinder;
public class MapModule extends AbstractModule {
@Override
protected void configure() {
// Create a MapBinder for String keys and Integer values
MapBinder<String, Integer> mapBinder = MapBinder.newMapBinder(binder(), String.class, Integer.class);
// Bind multiple key-value pairs to the MapBinder
mapBinder.addBinding("One").toInstance(1);
mapBinder.addBinding("Two").toInstance(2);
mapBinder.addBinding("Three").toInstance(3);
}
}
এখানে, MapBinder.newMapBinder(binder(), String.class, Integer.class) ব্যবহার করে Map<String, Integer> তৈরি করা হয়েছে। তারপরে, addBinding().toInstance() দিয়ে Key-Value পেয়ারগুলো যুক্ত করা হয়েছে।
Step 2: Injecting the Map
এখন, Map<String, Integer> ইনজেক্ট করতে, আপনার ক্লাসে @Inject ব্যবহার করুন:
import com.google.inject.Inject;
import java.util.Map;
public class MapExample {
private final Map<String, Integer> myMap;
@Inject
public MapExample(Map<String, Integer> myMap) {
this.myMap = myMap;
}
public void printMap() {
for (Map.Entry<String, Integer> entry : myMap.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
}
public static void main(String[] args) {
Injector injector = Guice.createInjector(new MapModule());
MapExample app = injector.getInstance(MapExample.class);
app.printMap();
}
}
এখানে, Guice Map<String, Integer> ইনজেক্ট করবে, যেখানে "One", "Two", "Three" কীগুলির জন্য যথাক্রমে মান 1, 2, 3 দেওয়া হয়েছে।
Output:
One: 1
Two: 2
Three: 3
3. Multibindings with Provider (Advanced Usage)
আপনি যদি একাধিক ডিপেন্ডেন্সি ইনস্ট্যান্স যোগ করতে চান যেগুলির জন্য কিছু নির্দিষ্ট কাস্টম লজিক প্রয়োজন হয়, তবে আপনি Provider ব্যবহার করতে পারেন। এ ক্ষেত্রে, আপনি Provider<T> ব্যবহার করে Lazy Instantiation এবং Complex Logic প্রয়োগ করতে পারেন।
Example: Multibindings with Provider
import com.google.inject.AbstractModule;
import com.google.inject.Provider;
import com.google.inject.multibindings.Multibinder;
public class ProviderModule extends AbstractModule {
@Override
protected void configure() {
Multibinder<Provider<String>> binder = Multibinder.newSetBinder(binder(), Provider.class);
binder.addBinding().toInstance(() -> "Hello from Provider 1");
binder.addBinding().toInstance(() -> "Hello from Provider 2");
}
}
এখানে, Provider<String> ব্যবহার করে একাধিক String ইনস্ট্যান্স তৈরি করা হচ্ছে, যেগুলির উপর কিছু নির্দিষ্ট কাস্টম লজিক প্রয়োগ করা যাবে।
Guice-এ Multibindings ব্যবহার করে আপনি সহজে Complex Data Structures তৈরি করতে পারেন যেমন List, Set, এবং Map। এটি একাধিক উপাদানকে একই টাইপের কন্টেইনারে বাইনড করার জন্য উপযোগী এবং প্রোগ্রামিংয়ের পুনরাবৃত্তি এড়াতে সাহায্য করে। Multibinder এবং MapBinder ব্যবহার করে আপনি একাধিক ডিপেন্ডেন্সি একত্রে ম্যানেজ করতে পারবেন, যা কোডকে আরও মডুলার এবং পরিষ্কার করে।
Read more