Guice হল গুগলের Dependency Injection (DI) ফ্রেমওয়ার্ক, যা Constructor Injection এবং Field Injection এর মতো বিভিন্ন DI প্যাটার্ন সহজে বাস্তবায়নের সুযোগ দেয়।
Constructor Injection
Constructor Injection হল এমন একটি প্যাটার্ন যেখানে নির্ভরশীলতাগুলি (dependencies) একটি ক্লাসের constructor এর মাধ্যমে ইনজেক্ট করা হয়। এটি সবচেয়ে জনপ্রিয় DI প্যাটার্ন, কারণ এটি:
- Immutable objects তৈরি করতে সহায়ক।
- ডিপেনডেন্সি স্পষ্টভাবে ঘোষণা করে, যা loose coupling নিশ্চিত করে।
Constructor Injection উদাহরণ
Step 1: Define Interfaces and Implementations
public interface Service {
void serve();
}
public class ServiceImpl implements Service {
@Override
public void serve() {
System.out.println("Service is serving...");
}
}
Step 2: Use Constructor Injection
import com.google.inject.Inject;
public class Client {
private final Service service;
@Inject
public Client(Service service) { // Constructor Injection
this.service = service;
}
public void doSomething() {
service.serve();
}
}
Step 3: Create a Guice Module
import com.google.inject.AbstractModule;
public class AppModule extends AbstractModule {
@Override
protected void configure() {
bind(Service.class).to(ServiceImpl.class); // Bind Interface to Implementation
}
}
Step 4: Bootstrap the Application
import com.google.inject.Guice;
import com.google.inject.Injector;
public class Main {
public static void main(String[] args) {
Injector injector = Guice.createInjector(new AppModule());
Client client = injector.getInstance(Client.class); // Dependency Injected
client.doSomething();
}
}
Field Injection
Field Injection হল এমন একটি পদ্ধতি যেখানে নির্ভরশীলতাগুলি সরাসরি fields এ ইনজেক্ট করা হয়। এটি তখনই কার্যকর, যখন:
- নির্ভরশীলতা খুব বেশি সংখ্যা বা সহজ।
- ফিল্ডগুলোতে সরাসরি অ্যাক্সেস প্রয়োজন।
যদিও এটি Constructor Injection এর চেয়ে কম পছন্দ করা হয় কারণ:
- এটি encapsulation লঙ্ঘন করতে পারে।
- নির্ভরশীলতাগুলি ক্লাসের ভেতরে স্পষ্টভাবে ঘোষণা করা হয় না।
Field Injection উদাহরণ
Step 1: Define Interfaces and Implementations
public interface Service {
void serve();
}
public class ServiceImpl implements Service {
@Override
public void serve() {
System.out.println("Service is serving...");
}
}
Step 2: Use Field Injection
import com.google.inject.Inject;
public class Client {
@Inject
private Service service; // Field Injection
public void doSomething() {
service.serve();
}
}
Step 3: Create a Guice Module
import com.google.inject.AbstractModule;
public class AppModule extends AbstractModule {
@Override
protected void configure() {
bind(Service.class).to(ServiceImpl.class); // Bind Interface to Implementation
}
}
Step 4: Bootstrap the Application
import com.google.inject.Guice;
import com.google.inject.Injector;
public class Main {
public static void main(String[] args) {
Injector injector = Guice.createInjector(new AppModule());
Client client = injector.getInstance(Client.class); // Dependency Injected
client.doSomething();
}
}
Constructor Injection বনাম Field Injection
| Constructor Injection | Field Injection |
|---|---|
| নির্ভরশীলতাগুলি কনস্ট্রাক্টর প্যারামিটারের মাধ্যমে ইনজেক্ট হয়। | নির্ভরশীলতাগুলি সরাসরি ফিল্ডে ইনজেক্ট হয়। |
| কোডে নির্ভরশীলতা স্পষ্টভাবে দেখা যায়। | নির্ভরশীলতা লুকায়িত থাকে। |
| Immutable Objects তৈরি করতে সহায়ক। | Encapsulation লঙ্ঘন করার সম্ভাবনা। |
| টেস্টেবিলিটি উন্নত। | টেস্টে নির্ভরশীলতা পরিবর্তন কঠিন। |
| Preferred for most scenarios | নির্দিষ্ট ক্ষেত্রে যেমন দ্রুত ডেভেলপমেন্ট। |
- Constructor Injection সাধারণত সবচেয়ে ভালো পদ্ধতি, কারণ এটি কোডকে আরও readable, testable, এবং maintainable করে।
- Field Injection বিশেষ ক্ষেত্রে ব্যবহার করা হয়, যেখানে নির্ভরশীলতাগুলির সংখ্যা বেশি এবং তাদের সরাসরি অ্যাক্সেস প্রয়োজন।
আপনার প্রয়োজন এবং স্থাপনার উপর ভিত্তি করে, উপযুক্ত DI পদ্ধতি বেছে নিন। Guice উভয় পদ্ধতিকে কার্যকরভাবে সমর্থন করে।
Read more