Guice-এ Multibindings একটি শক্তিশালী কনসেপ্ট যা আপনাকে একাধিক মান (values) একত্রিত করতে দেয়, যেমন Map বা Set। এটি বিশেষভাবে কার্যকর যখন আপনি একাধিক ইমপ্লিমেন্টেশন বা ডিপেনডেন্সি ইনজেক্ট করতে চান একটি কনটেইনার (যেমন, Map বা Set) ব্যবহার করে।
Guice-এ Multibindings ব্যবহার করার মাধ্যমে আপনি সহজেই একাধিক ডিপেনডেন্সি ম্যানেজ করতে পারেন, যা পরে একত্রিত হয়ে আপনার অ্যাপ্লিকেশনকে আরো ডাইনামিক এবং রিইউজেবল করে তোলে।
এখানে Map এবং Set Multibindings ব্যবহার করার জন্য একটি উদাহরণ দেওয়া হলো।
1. Guice Multibindings: Set Binding
Guice-এ Set Multibindings ব্যবহার করলে আপনি একই টাইপের একাধিক ইনস্ট্যান্স (যেমন, Service ইন্টারফেসের ভিন্ন ভিন্ন ইমপ্লিমেন্টেশন) একটি Set হিসেবে ব্যন্ড করতে পারবেন।
Step 1: Create Service Interface and Implementations
প্রথমে একটি Service ইন্টারফেস এবং তার দুটি ইমপ্লিমেন্টেশন তৈরি করি:
public interface Service {
void execute();
}
public class ServiceA implements Service {
@Override
public void execute() {
System.out.println("Executing Service A");
}
}
public class ServiceB implements Service {
@Override
public void execute() {
System.out.println("Executing Service B");
}
}
Step 2: Create a Guice Module with Multibinding for Set
এখন, আমরা Guice-এ Set Multibindings কনফিগার করবো। Guice-এ Multibindings ব্যবহার করার জন্য আপনাকে Multibinder ব্যবহার করতে হবে।
import com.google.inject.AbstractModule;
import com.google.inject.multibindings.Multibinder;
public class AppModule extends AbstractModule {
@Override
protected void configure() {
// Create a Multibinder for Set<Service>
Multibinder<Service> serviceBinder = Multibinder.newSetBinder(binder(), Service.class);
// Bind Service implementations to the Set
serviceBinder.addBinding().to(ServiceA.class);
serviceBinder.addBinding().to(ServiceB.class);
}
}
Step 3: Use the Set of Services
এখন, আপনি Guice Injector ব্যবহার করে Set<Service> ইনজেক্ট করতে পারেন এবং সমস্ত সার্ভিসের মেথড কল করতে পারেন।
import com.google.inject.Guice;
import com.google.inject.Injector;
import java.util.Set;
public class Main {
public static void main(String[] args) {
// Create the Guice injector
Injector injector = Guice.createInjector(new AppModule());
// Get the Set<Service> instance
Set<Service> services = injector.getInstance(Set.class);
// Iterate through and execute each service
for (Service service : services) {
service.execute();
}
}
}
Output:
Executing Service A
Executing Service B
2. Guice Multibindings: Map Binding
Guice-এ Map Multibindings ব্যবহার করার মাধ্যমে আপনি একটি Map-এ বিভিন্ন ধরনের ডিপেনডেন্সি যুক্ত করতে পারেন, যেখানে কীগুলি সাধারণত স্ট্রিং বা অন্য যেকোনো অবজেক্ট হতে পারে, এবং মানগুলি বিভিন্ন ইমপ্লিমেন্টেশন হতে পারে। এটি খুবই কার্যকর যখন আপনি একটি কীগত মান (key-value pairs) ম্যানেজ করতে চান।
Step 1: Create Service Interface and Implementations
অবশ্যই, একই Service ইন্টারফেস এবং তার ইমপ্লিমেন্টেশনগুলোর প্রয়োজন হবে, যেমন আগের উদাহরণে ছিল।
public class ServiceA implements Service {
@Override
public void execute() {
System.out.println("Executing Service A");
}
}
public class ServiceB implements Service {
@Override
public void execute() {
System.out.println("Executing Service B");
}
}
Step 2: Create a Guice Module with Multibinding for Map
এবার, আমরা Map Multibinding কনফিগার করব। এখানে আমরা একটি কাস্টম কীগুলি (যেমন, স্ট্রিং) ব্যবহার করে সার্ভিসগুলির মান সংরক্ষণ করব।
import com.google.inject.AbstractModule;
import com.google.inject.multibindings.MapBinder;
public class AppModule extends AbstractModule {
@Override
protected void configure() {
// Create a MapBinder for Map<String, Service>
MapBinder<String, Service> mapBinder = MapBinder.newMapBinder(binder(), String.class, Service.class);
// Bind Services to Map with corresponding keys
mapBinder.addBinding("ServiceA").to(ServiceA.class);
mapBinder.addBinding("ServiceB").to(ServiceB.class);
}
}
Step 3: Use the Map of Services
এখন, আপনি Guice Injector ব্যবহার করে Map<String, Service> ইনজেক্ট করতে পারেন এবং প্রয়োজন অনুসারে মানগুলি (values) অ্যাক্সেস করতে পারেন।
import com.google.inject.Guice;
import com.google.inject.Injector;
import java.util.Map;
public class Main {
public static void main(String[] args) {
// Create the Guice injector
Injector injector = Guice.createInjector(new AppModule());
// Get the Map<String, Service> instance
Map<String, Service> services = injector.getInstance(Map.class);
// Get and execute each service by key
services.get("ServiceA").execute(); // Output: Executing Service A
services.get("ServiceB").execute(); // Output: Executing Service B
}
}
Output:
Executing Service A
Executing Service B
3. Guice Multibindings এর সুবিধা
- Multiple Bindings: একাধিক ইমপ্লিমেন্টেশন একটি কনটেইনার (যেমন
SetবাMap) এর মধ্যে ম্যানেজ করা সম্ভব হয়, যা কোডকে আরো মডুলার এবং সহজলভ্য করে তোলে। - Dynamic Binding: Multibindings আপনাকে একই ধরনের অনেকগুলো ইনস্ট্যান্স ইনজেক্ট করার সুযোগ দেয়, যেমন
Serviceইন্টারফেসের অনেকগুলো ভিন্ন ইমপ্লিমেন্টেশন। - Flexibility:
SetএবংMapMultibindings ব্যবহার করে আপনি ডিপেনডেন্সি ব্যবস্থাপনা আরো ডাইনামিক এবং ফ্লেক্সিবল করতে পারেন। - Cleaner Code:
Multibinderব্যবহার করে আপনি আপনার কোডের রিডেবিলিটি এবং মেইনটেনেবিলিটি বৃদ্ধি করতে পারেন, কারণ একাধিক মানের জন্য আলাদা আলাদা Binding করা সহজ হয়।
Guice-এ Multibindings ব্যবহারের মাধ্যমে আপনি Set এবং Map এ একাধিক ডিপেনডেন্সি সহজে এবং কার্যকরভাবে ব্যন্ড করতে পারেন। এটি আপনার অ্যাপ্লিকেশনকে আরো মডুলার এবং সম্প্রসারণযোগ্য করে তোলে। আপনি যখন একাধিক ইমপ্লিমেন্টেশন বা কনফিগারেশন ম্যানেজ করতে চান, তখন Guice-এ Multibindings ব্যবহৃত হয়।
Read more