Optional Dependencies হ্যান্ডল করা

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

305

Guice Dependency Injection (DI) ফ্রেমওয়ার্কে, কিছু নির্ভরশীলতা optional (ঐচ্ছিক) হতে পারে। এর মানে হল যে, কিছু ডিপেনডেন্সি সরবরাহ করা না-ও হতে পারে বা তাদের ইনজেকশন কনফিগারেশন অনুযায়ী অপশনাল হতে পারে। Guice এই ধরনের পরিস্থিতি optional dependencies হ্যান্ডল করতে বেশ কিছু উপায় প্রদান করে।

এখানে Optional Dependencies হ্যান্ডল করার জন্য বিভিন্ন পদ্ধতির আলোচনা করা হবে, যেমন @Inject, Optional ক্লাস, এবং @Provides মেথডের মাধ্যমে।


1. Guice-এ Optional Dependencies এর জন্য Optional ব্যবহার

Guice java.util.Optional ব্যবহার করে optional dependencies সহজে হ্যান্ডল করতে পারে। Guice স্বয়ংক্রিয়ভাবে Optional ইনজেক্ট করতে পারে যখন একটি ডিপেনডেন্সি ঐচ্ছিক (optional) হয়।

এটি কীভাবে কাজ করে?

  • Optional ক্লাসটি Java 8 থেকে আসছে এবং এটি একটি nullable ফিল্ড হিসেবে কাজ করে।
  • যদি একটি ডিপেনডেন্সি মডিউলে Optional.empty() থাকে, তবে Guice ঐ ডিপেনডেন্সি সরবরাহ করবে না।
  • Optional ডিপেনডেন্সি ইনজেকশনকে null handling থেকে মুক্তি দেয়।

উদাহরণ:

import com.google.inject.Inject;
import java.util.Optional;

public class BillingService {
    private final PaymentService paymentService;
    private final Optional<DiscountService> discountService;  // Optional dependency

    @Inject
    public BillingService(PaymentService paymentService, Optional<DiscountService> discountService) {
        this.paymentService = paymentService;
        this.discountService = discountService;
    }

    public void processPayment() {
        paymentService.pay();
        discountService.ifPresent(DiscountService::applyDiscount); // If present, apply discount
    }
}

interface PaymentService {
    void pay();
}

class PaypalPaymentService implements PaymentService {
    public void pay() {
        System.out.println("Payment made via PayPal.");
    }
}

interface DiscountService {
    void applyDiscount();
}

class SeasonalDiscountService implements DiscountService {
    public void applyDiscount() {
        System.out.println("Seasonal discount applied.");
    }
}

Guice Module:

import com.google.inject.AbstractModule;
import com.google.inject.Provides;
import com.google.inject.Singleton;

public class BillingModule extends AbstractModule {
    @Override
    protected void configure() {
        bind(PaymentService.class).to(PaypalPaymentService.class); // Mandatory dependency
    }

    @Provides
    @Singleton
    public Optional<DiscountService> provideDiscountService() {
        return Optional.of(new SeasonalDiscountService());  // Optional dependency
    }
}

Usage:

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

public class Main {
    public static void main(String[] args) {
        Injector injector = Guice.createInjector(new BillingModule());
        BillingService billingService = injector.getInstance(BillingService.class);
        billingService.processPayment();  // Output: Payment made via PayPal. Seasonal discount applied.
    }
}

Explanation:

  • Optional<DiscountService> ডিপেনডেন্সি ঐচ্ছিক, যদি এটি সরবরাহ করা না হয়, তবে Guice Optional.empty() ইনজেক্ট করবে এবং কোন ত্রুটি সৃষ্টি হবে না।
  • যদি DiscountService ইনজেক্ট করা হয়, তবে applyDiscount() কল হবে।

2. Optional Dependencies with @Provides

আপনি Guice-এ @Provides মেথড ব্যবহার করে Optional ডিপেনডেন্সি সরবরাহ করতে পারেন। এখানে একটি উদাহরণ দেওয়া হলো যেখানে একটি ডিপেনডেন্সি কেবল তখনই সরবরাহ করা হয় যদি তা প্রয়োজনীয় হয়।

Example:

import com.google.inject.AbstractModule;
import com.google.inject.Provides;
import com.google.inject.Singleton;
import java.util.Optional;

public class BillingModule extends AbstractModule {

    @Override
    protected void configure() {
        bind(PaymentService.class).to(PaypalPaymentService.class);
    }

    @Provides
    @Singleton
    public Optional<DiscountService> provideDiscountService() {
        // Return an Optional of DiscountService based on some condition
        boolean isDiscountAvailable = checkSeasonalDiscount();
        return isDiscountAvailable ? Optional.of(new SeasonalDiscountService()) : Optional.empty();
    }

    private boolean checkSeasonalDiscount() {
        // Dummy logic for seasonal discount availability
        return true;
    }
}

Explanation:

  • এখানে @Provides মেথডে Optional<DiscountService> প্রদান করা হচ্ছে।
  • যদি checkSeasonalDiscount() true ফেরত দেয়, তাহলে Optional.of(new SeasonalDiscountService()) ফেরত দিবে, অন্যথায় Optional.empty() ফেরত দেবে।
  • এই ভাবে, Guice DiscountService ডিপেনডেন্সিটি ঐচ্ছিকভাবে ইনজেক্ট করবে।

3. Handling Optional Dependencies Using @Inject and Conditional Bindings

এছাড়াও Guice-এ আপনি কিছু কাস্টম লজিক ব্যবহার করে conditional bindings করতে পারেন, যেমন কোনো নির্দিষ্ট অবস্থায় একটি ডিপেনডেন্সি ইনজেক্ট করা অথবা না করা।

Example:

import com.google.inject.AbstractModule;
import com.google.inject.Inject;
import com.google.inject.Provides;
import com.google.inject.Singleton;
import java.util.Optional;

public class BillingModule extends AbstractModule {

    @Override
    protected void configure() {
        bind(PaymentService.class).to(PaypalPaymentService.class);
    }

    @Provides
    @Singleton
    public Optional<DiscountService> provideDiscountService() {
        // If seasonal discount is available, inject DiscountService
        boolean isSeasonalDiscount = isSeasonalDiscountAvailable();
        return isSeasonalDiscount ? Optional.of(new SeasonalDiscountService()) : Optional.empty();
    }

    private boolean isSeasonalDiscountAvailable() {
        // Logic to check if seasonal discount is available
        return true;
    }
}

public class BillingService {
    private final PaymentService paymentService;
    private final Optional<DiscountService> discountService;

    @Inject
    public BillingService(PaymentService paymentService, Optional<DiscountService> discountService) {
        this.paymentService = paymentService;
        this.discountService = discountService;
    }

    public void processPayment() {
        paymentService.pay();
        discountService.ifPresent(DiscountService::applyDiscount); // Will apply discount if available
    }
}

public class Main {
    public static void main(String[] args) {
        Injector injector = Guice.createInjector(new BillingModule());
        BillingService billingService = injector.getInstance(BillingService.class);
        billingService.processPayment();  // Output: Payment made via PayPal. Seasonal discount applied.
    }
}

Guice Optional Dependencies Summary

  • Optional ব্যবহার করে, Guice সহজেই optional dependencies হ্যান্ডল করতে পারে।
  • Optional.empty() ব্যবহার করে Guice ঐচ্ছিক ডিপেনডেন্সি ইনজেক্ট না করার পরিস্থিতি হ্যান্ডল করতে পারে।
  • @Provides মেথড এবং Optional ব্যবহার করে কাস্টম লজিক সহ ডিপেনডেন্সি সরবরাহ করা যায়।
  • Guice ডিপেনডেন্সি ইনজেকশনকে আরও নমনীয় এবং টেস্টযোগ্য করে তোলে, বিশেষ করে ঐচ্ছিক ডিপেনডেন্সি ইনজেকশনের ক্ষেত্রে।

Guice-এর মাধ্যমে optional dependencies সহজে ম্যানেজ করা যায় এবং এই ব্যবস্থাটি কোডের decoupling এবং testability বৃদ্ধি করে।

Content added By
Promotion

Are you sure to start over?

Loading...