Constructor Injection এর ধারণা এবং ব্যবহার

Constructor এবং Field Injection - গুইস (Guice) - Java Technologies

300

Constructor Injection হল Dependency Injection (DI) প্যাটার্নের একটি পদ্ধতি, যেখানে ডিপেনডেন্সি গুলো কনস্ট্রাক্টরের মাধ্যমে ইনজেক্ট করা হয়। এই পদ্ধতিতে, যখন একটি অবজেক্ট তৈরি করা হয়, তখন তার কনস্ট্রাক্টরটি ডিপেনডেন্সি ইনজেকশন পরিচালনা করে।

Guice ফ্রেমওয়ার্কে, Constructor Injection হল একটি সাধারণ এবং সুপারিশকৃত পদ্ধতি যেখানে নির্দিষ্ট ডিপেনডেন্সি গুলো কনস্ট্রাক্টরের মাধ্যমে সরবরাহ করা হয়, ফলে ডিপেনডেন্সির প্রয়োজনীয়তা সরাসরি ক্লাসের কনস্ট্রাক্টরের মাধ্যমে ডিফাইন করা হয়।


Constructor Injection এর ধারণা

Constructor Injection একটি সহজ এবং কার্যকর পদ্ধতি যা ইনস্ট্যান্স তৈরি করার সময় ক্লাসের প্রয়োজনীয় ডিপেনডেন্সি সরবরাহ করে। ডিপেনডেন্সি সরবরাহকারী (Dependency Provider) গুলি কনস্ট্রাক্টরের মাধ্যমে ইনজেক্ট হয়ে থাকে।

কিভাবে কাজ করে:

  • যখন একটি ক্লাস তৈরি করা হয়, Guice নিশ্চিত করে যে সেই ক্লাসের কনস্ট্রাক্টর যেসকল ডিপেনডেন্সি দাবি করে, সেগুলি সঠিকভাবে ইনজেক্ট করা হয়েছে।
  • কনস্ট্রাক্টরের প্যারামিটার হিসেবে ডিপেনডেন্সি প্রদান করা হয় এবং Guice Injector সেই ডিপেনডেন্সি গুলিকে সঠিকভাবে ইনস্ট্যান্সে ইনজেক্ট করে।

Constructor Injection ব্যবহার করার সুবিধা

  1. Immutable Objects:
    • Constructor Injection ব্যবহার করলে ক্লাসটি immutable হতে পারে, কারণ ডিপেনডেন্সি একবার কনস্ট্রাক্টরে ইনজেক্ট হওয়ার পর পরিবর্তনযোগ্য নয়। এটি কোডের নিরাপত্তা এবং সঠিকতা নিশ্চিত করে।
  2. Clear Dependency Declaration:
    • কনস্ট্রাক্টরের মাধ্যমে ডিপেনডেন্সি ইনজেকশন করলে, ক্লাসের ডিপেনডেন্সি স্পষ্টভাবে ঘোষণা করা হয়, যা কোডকে আরও রিডেবল এবং সুসংগঠিত করে তোলে।
  3. Required Dependencies:
    • কনস্ট্রাক্টর ইনজেকশন এমন একটি পদ্ধতি যেখানে ডিপেনডেন্সি গুলো বাধ্যতামূলক হয়ে থাকে। এটি নিশ্চিত করে যে নির্দিষ্ট ডিপেনডেন্সি ছাড়া কোনো অবজেক্ট তৈরি করা যাবে না।
  4. Easier Testing:
    • Constructor Injection সহজে ইউনিট টেস্টে ব্যবহৃত হতে পারে, কারণ আপনি ডিপেনডেন্সি গুলি কনস্ট্রাক্টরের মাধ্যমে সরাসরি ইনজেক্ট করতে পারেন।

Guice তে Constructor Injection ব্যবহার

1. ইন্টারফেস এবং ইমপ্লিমেন্টেশন তৈরি করা

public interface Repository {
    void save();
}

public class RepositoryImpl implements Repository {
    @Override
    public void save() {
        System.out.println("Data saved!");
    }
}

2. Service ক্লাস তৈরি করা

public class Service {
    private final Repository repository;

    // Constructor Injection
    @Inject
    public Service(Repository repository) {
        this.repository = repository;
    }

    public void performTask() {
        repository.save();  // Using the injected dependency
    }
}

3. Module তৈরি করা (Binding)

import com.google.inject.AbstractModule;

public class AppModule extends AbstractModule {
    @Override
    protected void configure() {
        // Binding Repository to its implementation
        bind(Repository.class).to(RepositoryImpl.class);
    }
}

4. Injector তৈরি করা এবং ডিপেনডেন্সি ইনজেকশন করা

import com.google.inject.Guice;
import com.google.inject.Injector;

public class Application {
    public static void main(String[] args) {
        // Creating Injector and injecting dependencies
        Injector injector = Guice.createInjector(new AppModule());

        // Retrieving Service instance with injected Repository
        Service service = injector.getInstance(Service.class);
        service.performTask();  // This will call repository.save()
    }
}

এখানে কি হচ্ছে?

  • AppModule-এ bind(Repository.class).to(RepositoryImpl.class) এর মাধ্যমে Guice জানায় যে, Repository ইন্টারফেসটি RepositoryImpl ক্লাসের মাধ্যমে ইনজেক্ট হবে।
  • Service ক্লাসের কনস্ট্রাক্টরটি Repository ডিপেনডেন্সি দাবি করছে এবং Guice তা ইনজেক্ট করছে।

Constructor Injection এর অন্যান্য উদাহরণ

অন্য ধরনের ডিপেনডেন্সি ইনজেকশন (Multiple Dependencies)

public class Service {
    private final Repository repository;
    private final NotificationService notificationService;

    @Inject
    public Service(Repository repository, NotificationService notificationService) {
        this.repository = repository;
        this.notificationService = notificationService;
    }

    public void performTask() {
        repository.save();
        notificationService.sendNotification();
    }
}

Module কনফিগারেশন (Multiple Bindings)

public class AppModule extends AbstractModule {
    @Override
    protected void configure() {
        bind(Repository.class).to(RepositoryImpl.class);
        bind(NotificationService.class).to(NotificationServiceImpl.class);
    }
}

এখানে Service ক্লাস দুটি ডিপেনডেন্সি গ্রহণ করছে: Repository এবং NotificationService। Guice এই দুই ডিপেনডেন্সি ইনজেক্ট করবে।


Constructor Injection এর কিছু সীমাবদ্ধতা

  1. Required Dependencies:
    • Constructor Injection সবসময় required ডিপেনডেন্সি গুলিকে বাধ্যতামূলক করে তোলে, যা সব ক্ষেত্রে সুবিধাজনক নাও হতে পারে।
    • যদি কোনো ডিপেনডেন্সি optional হয়, তবে আপনি সেটি কনস্ট্রাক্টরের মাধ্যমে ইনজেক্ট করতে চাইবেন না, কারণ এটি ক্লাসটি আরও কঠিন করে তুলতে পারে।
  2. Complex Constructors:
    • যদি একটি ক্লাসে অনেক ডিপেনডেন্সি থাকে, তবে কনস্ট্রাক্টরটি খুব বড় হয়ে যেতে পারে, যা কোডের রিডেবিলিটি কমাতে পারে। একে constructor over-injection বলা হয়।

Constructor Injection হল DI প্যাটার্নের একটি শক্তিশালী পদ্ধতি যা ডিপেনডেন্সি গুলিকে কনস্ট্রাক্টরের মাধ্যমে ইনজেক্ট করে, এবং এটি কোডের রিডেবিলিটি, নিরাপত্তা এবং টেস্টেবিলিটি বৃদ্ধি করতে সহায়তা করে। Guice এর মাধ্যমে Constructor Injection ব্যবহারে, কোড আরো মডুলার, স্থিতিশীল এবং সহজে পরিচালিত হয়। তবে, যদি অনেক ডিপেনডেন্সি থাকে, তবে এটি কিছুটা জটিল হয়ে যেতে পারে, তবে সাধারণত এটি কোডের গুণগত মান বৃদ্ধি করার জন্য একটি অত্যন্ত সুপারিশকৃত পদ্ধতি।

Content added By
Promotion

Are you sure to start over?

Loading...