Skill

ডিপেন্ডেন্সি ইনজেকশন (Dependency Injection)

অরেলিয়া Aurelia) - Web Development

283

ডিপেনডেন্সি ইনজেকশন (DI) হল একটি ডিজাইন প্যাটার্ন যা ক্লাস বা মডিউলের উপর তাদের ডিপেনডেন্সি বা নির্ভরশীলতা সরবরাহ করার একটি পদ্ধতি। Aurelia ফ্রেমওয়ার্কে, ডিপেনডেন্সি ইনজেকশন ব্যবস্থাটি অত্যন্ত শক্তিশালী এবং সহজে ব্যবহৃত হয়, যা কোডের মডুলারিটি এবং টেস্টেবিলিটি বৃদ্ধি করতে সাহায্য করে।

Aurelia-এর ডিপেনডেন্সি ইনজেকশন সিস্টেম এমনভাবে ডিজাইন করা হয়েছে যাতে আপনি সহজেই আপনার অ্যাপ্লিকেশনের ক্লাসগুলোর মধ্যে ডিপেনডেন্সি ম্যানেজ করতে পারেন এবং সেগুলোর ইনস্ট্যান্স অটোমেটিকভাবে ইনজেক্ট করতে পারেন।


ডিপেনডেন্সি ইনজেকশনের মূল ধারণা

ডিপেনডেন্সি ইনজেকশন একটি পদ্ধতি যেখানে ক্লাসের বাইরে থেকে তার ডিপেনডেন্সি সরবরাহ করা হয়। এর মাধ্যমে আপনি ক্লাসগুলিকে পরস্পর নির্ভরশীল না রেখে আলাদা রাখতে পারেন, যা কোডের রক্ষণাবেক্ষণ এবং টেস্টিং সহজ করে তোলে।

Aurelia ফ্রেমওয়ার্কে, এটি ইনস্ট্যান্স ইনজেকশন এবং কনস্ট্রাক্টর ইনজেকশন এর মাধ্যমে কাজ করে।


Aurelia তে ডিপেনডেন্সি ইনজেকশন ব্যবহার

Aurelia তে ডিপেনডেন্সি ইনজেকশন সহজে ব্যবহার করা যায় এবং এটি স্বয়ংক্রিয়ভাবে ক্লাসের ডিপেনডেন্সি পরিচালনা করে। আপনার অ্যাপ্লিকেশনের কোথাও কোনো ক্লাসের ডিপেনডেন্সি ইনজেক্ট করার জন্য আপনাকে কিছু প্রাথমিক কনফিগারেশন করতে হবে। এটি সাধারণত কনস্ট্রাক্টর ফাংশন ব্যবহার করে।

১. সার্ভিস তৈরি করা

প্রথমে, একটি সার্ভিস তৈরি করা যাক যা অন্য ক্লাস দ্বারা ব্যবহৃত হবে।

example.service.js:

export class ExampleService {
  getMessage() {
    return "Hello from ExampleService!";
  }
}

এটি একটি সাধারণ সার্ভিস ক্লাস যা একটি getMessage() মেথড প্রদান করে।

২. সার্ভিস ইনজেক্ট করা

এখন, আমরা এই সার্ভিসটি অন্য কোনো ক্লাসে ইনজেক্ট করব। একটি ভিউমডেল ক্লাস তৈরি করি এবং তার কনস্ট্রাক্টরের মাধ্যমে সার্ভিস ইনজেক্ট করি।

app.js:

import { ExampleService } from './example.service';

export class App {
  static inject = [ExampleService];  // ডিপেনডেন্সি ইনজেকশন

  constructor(exampleService) {
    this.exampleService = exampleService;
    this.message = this.exampleService.getMessage();
  }
}

এখানে App ক্লাসে, ExampleService ইনজেক্ট করা হয়েছে। এটি static inject প্রপার্টির মাধ্যমে করা হয়েছে, যা একটি অ্যারে হিসেবে সার্ভিসের ক্লাসের নাম দেয়। Aurelia এই সার্ভিসটিকে স্বয়ংক্রিয়ভাবে ইনজেক্ট করবে যখন App ক্লাসের ইনস্ট্যান্স তৈরি হবে।

৩. ভিউ তে সার্ভিস ব্যবহার করা

এখন, আমরা ভিউ ফাইলে App ক্লাসের message প্রপার্টি ব্যবহার করে সেই সার্ভিসের আউটপুট দেখাবো।

app.html:

<template>
  <h1>${message}</h1>
</template>

এখানে, message প্রপার্টি ExampleService থেকে আসা একটি স্ট্রিং ধারণ করছে এবং এটি HTML এ প্রদর্শিত হবে।


Aurelia তে ডিপেনডেন্সি ইনজেকশনের সুবিধা

১. কোড মডুলারিটি

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

২. টেস্টেবিলিটি

ডিপেনডেন্সি ইনজেকশন দ্বারা কোড টেস্টিং সহজ হয়ে ওঠে। আপনি সহজেই মক (mock) বা ফেক (fake) সার্ভিস ইনজেক্ট করতে পারেন যা ইউনিট টেস্টের জন্য উপযোগী।

৩. কোড রিইউজেবিলিটি

একই সার্ভিস বা ফাংশন একাধিক ক্লাসে ব্যবহার করা সম্ভব হয়, কারণ এটি এক জায়গা থেকে ইনজেক্ট করা হয়, এবং সেই সার্ভিসের অবস্থা বা আচরণ অন্য ক্লাসের উপর নির্ভর করে না।

৪. স্বয়ংক্রিয় ইনজেকশন

Aurelia স্বয়ংক্রিয়ভাবে ইনজেকশন পরিচালনা করে, অর্থাৎ ডেভেলপারকে ডিপেনডেন্সি পরিচালনা করতে কোনো অতিরিক্ত কোড লেখার প্রয়োজন হয় না।


Aurelia তে ডিপেনডেন্সি ইনজেকশন কনফিগারেশন

Aurelia এ স্বয়ংক্রিয়ভাবে ইনজেকশন পরিচালিত হলেও, কখনও কখনও আপনাকে container ব্যবহার করে আরও কাস্টম ইনজেকশন কনফিগারেশন করতে হতে পারে।

কনটেইনার কনফিগারেশন:

Aurelia এর কনটেইনার সিস্টেমের মাধ্যমে আপনি সার্ভিসের লাইফটাইম এবং বিভিন্ন কনফিগারেশন সেট করতে পারেন।

import { Container } from 'aurelia-dependency-injection';
import { ExampleService } from './example.service';

// কনটেইনারে সার্ভিস নিবন্ধন
let container = new Container();
container.registerSingleton(ExampleService);

এখানে, registerSingleton() মেথডের মাধ্যমে আপনি ExampleService সার্ভিসটি একটি সিঙ্গলটন হিসেবে নিবন্ধন করেছেন, অর্থাৎ একটি একক ইনস্ট্যান্স সার্ভিসটি ব্যবহৃত হবে।


উপসংহার

Aurelia তে ডিপেনডেন্সি ইনজেকশন একটি গুরুত্বপূর্ণ বৈশিষ্ট্য, যা কোডের মডুলারিটি, টেস্টেবিলিটি এবং রিইউজেবিলিটি বৃদ্ধি করতে সাহায্য করে। এটি ডেভেলপারদের কমপ্লেক্স অ্যাপ্লিকেশন তৈরির ক্ষেত্রে সহজে ডিপেনডেন্সি পরিচালনা করতে সাহায্য করে এবং অটোমেটিকভাবে ইনস্ট্যান্স ইনজেক্ট করে। এটি একটি শক্তিশালী প্যাটার্ন যা অ্যাপ্লিকেশনের স্কেলেবিলিটি এবং রক্ষণাবেক্ষণকে সহজ করে তোলে।

Content added By

Aurelia একটি শক্তিশালী ডিপেনডেন্সি ইনজেকশন (DI) সিস্টেম প্রদান করে, যা অ্যাপ্লিকেশন নির্মাণ এবং তার কোডকে আরও মডুলার, রিইউজেবল এবং টেস্টেবল করে তোলে। Aurelia এর DI কনটেইনার একটি মূল উপাদান, যা ক্লাস বা সার্ভিসের মধ্যে প্রয়োজনীয় ডিপেনডেন্সি সঠিকভাবে ইনজেক্ট করে।

ডিপেনডেন্সি ইনজেকশন (Dependency Injection) কী?

ডিপেনডেন্সি ইনজেকশন (DI) হল একটি ডিজাইন প্যাটার্ন, যা অবজেক্টগুলোকে তাদের ডিপেনডেন্সি সরবরাহ করার একটি উপায় প্রদান করে, পরিবর্তে নিজে থেকে সেই ডিপেনডেন্সি তৈরি করা। এটি কোডের মডুলারিটি এবং পরীক্ষার যোগ্যতা (testability) উন্নত করতে সহায়তা করে।

Aurelia এর DI কনটেইনার ব্যবহার করে, আপনি খুব সহজেই ক্লাসগুলোর মধ্যে ডিপেনডেন্সি ইনজেক্ট করতে পারেন, যেমন সার্ভিস, রিপোজিটরি, API ক্লাস, বা কোনো ইউটিলিটি ক্লাস।


Aurelia DI কনটেইনারের মূল ধারণা

Aurelia এর DI কনটেইনার একটি সার্ভিস কনটেইনার হিসেবে কাজ করে, যা বিভিন্ন ডিপেনডেন্সি রেজিস্টার এবং রিজলভ (resolve) করতে সক্ষম। এটি একটি সিঙ্গেলটন বা অন্য ধরনের অবজেক্ট তৈরির দায়িত্ব পালন করে এবং ক্লাসের প্রয়োজন অনুযায়ী তা ইনজেক্ট করে।

১. ডিপেনডেন্সি রেজিস্টার করা

Aurelia DI কনটেইনারে ডিপেনডেন্সি রেজিস্টার করতে, আপনাকে প্রথমে সেই ডিপেনডেন্সি বা সার্ভিসটি একটি ক্লাস বা ফাংশন হিসেবে তৈরি করতে হবে। এরপর এই ডিপেনডেন্সি কে DI কনটেইনারে রেজিস্টার করতে হবে।

import { inject } from 'aurelia-framework';

class MyService {
  sayHello() {
    return "Hello from MyService!";
  }
}

@inject(MyService) // DI কনটেইনারে MyService রেজিস্টার করা হচ্ছে
export class App {
  constructor(myService) {
    this.myService = myService;
  }

  activate() {
    console.log(this.myService.sayHello());
  }
}

এখানে, @inject(MyService) ডেকোরেটরটি MyService কে App ক্লাসে ইনজেক্ট করছে। যখন App ক্লাস ইনস্ট্যান্স তৈরি হবে, তখন DI কনটেইনার থেকে MyService ইনজেক্ট হয়ে যাবে।

২. DI কনটেইনার থেকে ডিপেনডেন্সি রিজলভ করা

Aurelia DI কনটেইনার ডিপেনডেন্সি রিজলভ করতে container.get() বা container.invoke() পদ্ধতি ব্যবহার করতে পারে।

import { Container } from 'aurelia-framework';

class MyService {
  sayHello() {
    return "Hello from MyService!";
  }
}

const container = new Container();
container.registerSingleton(MyService); // Singleton হিসেবে রেজিস্টার করা
const myServiceInstance = container.get(MyService); // DI কনটেইনার থেকে সার্ভিস রিজলভ করা
console.log(myServiceInstance.sayHello());

এখানে, MyService কে DI কনটেইনারে সিঙ্গেলটন হিসেবে রেজিস্টার করা হয়েছে এবং তারপর কনটেইনার থেকে রিজলভ করা হয়েছে।


Aurelia DI কনটেইনারের ফিচার

  1. সিঙ্গেলটন (Singleton) রেজিস্ট্রেশন:
    • DI কনটেইনারে সার্ভিসগুলিকে সিঙ্গেলটন হিসেবে রেজিস্টার করা যায়, যা সার্ভিসটির একক ইনস্ট্যান্স তৈরি করে এবং পরবর্তীতে সেই একক ইনস্ট্যান্স ব্যবহার করে।
    • উদাহরণ:

      container.registerSingleton(MyService);
      
  2. ট্রান্সিয়েন্ট রেজিস্ট্রেশন:
    • ট্রান্সিয়েন্ট রেজিস্ট্রেশন মানে, প্রতিটি নতুন ইনস্ট্যান্সের জন্য একটি নতুন অবজেক্ট তৈরি করা।
    • উদাহরণ:

      container.registerTransient(MyService);
      
  3. ফ্যাক্টরি রেজিস্ট্রেশন:
    • আপনি একটি ফ্যাক্টরি ফাংশন ব্যবহার করে ডাইনামিকভাবে ডিপেনডেন্সি রেজিস্টার করতে পারেন।
    • উদাহরণ:

      container.registerHandler(MyService, () => new MyService());
      
  4. নেস্টেড ইনজেকশন:
    • DI কনটেইনারের মধ্যে নেস্টেড ইনজেকশন বা সিড্যিপেনডেন্সি ইনজেকশন করা সম্ভব। অর্থাৎ একটি সার্ভিসের মধ্যে অন্য একটি সার্ভিস ইনজেক্ট করা।

Aurelia DI কনটেইনারের সুবিধাসমূহ

  1. কোডের মডুলারিটি বৃদ্ধি: DI ব্যবহারের মাধ্যমে আপনি আপনার কোডের বিভিন্ন অংশ আলাদা করে রাখতে পারেন, যা সহজে রিইউজেবল এবং মেইনটেইনেবল হয়।
  2. টেস্টযোগ্যতা (Testability): DI সিস্টেমের মাধ্যমে সহজেই ইউনিট টেস্টিং করা যায়, কারণ আপনি নির্দিষ্ট সার্ভিস বা ডিপেনডেন্সি সরবরাহ করতে পারেন, যা টেস্টিংয়ে সহায়তা করে।
  3. নির্ভরশীলতা কমানো (Loose Coupling): DI ব্যবহারের মাধ্যমে অবজেক্টগুলোর মধ্যে শক্তিশালী নির্ভরশীলতা কমানো যায়, যা কোডের পরিবর্তন এবং এক্সটেনশন সহজ করে তোলে।
  4. সহজ ডিপেনডেন্সি ম্যানেজমেন্ট: DI কনটেইনার আপনাকে আপনার অ্যাপ্লিকেশনের ডিপেনডেন্সি গুলো পরিচালনা করতে সহায়তা করে, যা কোডের গঠন সহজ করে তোলে।

উপসংহার

Aurelia এর ডিপেনডেন্সি ইনজেকশন কনটেইনার একটি শক্তিশালী বৈশিষ্ট্য যা অ্যাপ্লিকেশনের কোডকে আরও মডুলার, টেস্টেবল এবং রিইউজেবল করে তোলে। এটি ডিপেনডেন্সি ইনজেকশন প্যাটার্ন অনুসরণ করে, যার মাধ্যমে আপনি সার্ভিস বা ক্লাসগুলোর মধ্যে প্রয়োজনীয় ডিপেনডেন্সি সঠিকভাবে ইনজেক্ট করতে পারেন, এবং এর ফলে কোডের মান এবং রক্ষণাবেক্ষণ ক্ষমতা বৃদ্ধি পায়।

Content added By

Aurelia ফ্রেমওয়ার্কে সার্ভিস এবং কনফিগারেশন ইনজেকশন (Service and Configuration Injection) ব্যবহার করা হয় ডিপেনডেন্সি ইনজেকশন (Dependency Injection বা DI) এর মাধ্যমে। এটি একটি ডিজাইন প্যাটার্ন যা আপনাকে কোডের মধ্যে প্রয়োজনীয় ডিপেনডেন্সি ম্যানেজ করতে সাহায্য করে, যা অ্যাপ্লিকেশনের মডুলারিটি এবং টেস্টেবিলিটি বাড়ায়। Aurelia DI সিস্টেম খুবই শক্তিশালী এবং সহজ।


ডিপেনডেন্সি ইনজেকশন (DI) এর ধারণা

ডিপেনডেন্সি ইনজেকশন এমন একটি পদ্ধতি যেখানে একটি ক্লাসের প্রয়োজনীয় ডিপেনডেন্সি (যেমন সার্ভিস, ইউটিলিটি, বা অন্যান্য ক্লাস) সরাসরি ক্লাসের মধ্যে ইনস্টল বা ইনস্ট্যানশিয়েট না করে, বাইরের কোনো উৎস (যেমন কনটেইনার) দ্বারা ইনজেক্ট করা হয়। এতে কোডের পুনরায় ব্যবহারযোগ্যতা, টেস্টিং, এবং রক্ষণাবেক্ষণ সহজ হয়।


Aurelia তে DI ব্যবহারের পদ্ধতি

Aurelia এর DI সিস্টেম ব্যবহারের জন্য আপনাকে যে পদ্ধতিগুলি অনুসরণ করতে হবে তা হল:

১. সার্ভিস তৈরি করা

প্রথমে একটি সাধারণ সার্ভিস তৈরি করতে হবে, যা একটি নির্দিষ্ট কাজ বা ডেটা প্রদান করবে। উদাহরণস্বরূপ, একটি সিম্পল সার্ভিস তৈরি করা যেটি অ্যাপ্লিকেশনকে একটি বার্তা প্রদান করবে।

export class MyService {
  getMessage() {
    return "Hello from MyService!";
  }
}

এটি একটি সাধারণ সার্ভিস ক্লাস যা একটি মেসেজ রিটার্ন করবে।


২. সার্ভিস কনফিগার করা

Aurelia তে সার্ভিস কনফিগার করতে aurelia.container বা container.registerSingleton() বা container.registerInstance() ব্যবহার করা হয়। এই কনফিগারেশনটি অ্যাপ্লিকেশনে সার্ভিসটি কোনভাবে ইনজেক্ট করা হবে তা নির্ধারণ করে।

import { MyService } from './my-service';

export class App {
  static inject = [MyService];  // DI কনফিগারেশন

  constructor(myService) {
    this.myService = myService;
  }

  getMessage() {
    return this.myService.getMessage();
  }
}

এখানে, App ক্লাসের কনস্ট্রাক্টরটি MyService কে ইনজেক্ট করে। inject ডেকোরেটর DI সিস্টেমে এই সার্ভিসটির রেজিস্ট্রেশন নিশ্চিত করে।


৩. ডিপেনডেন্সি ইনজেকশন কনটেইনার ব্যবহার

Aurelia তে DI কনটেইনার ব্যবহার করে আপনার সার্ভিস এবং ক্লাস রেজিস্টার করা হয়। এটি সাধারণত অ্যাপ্লিকেশন স্টার্টআপ প্রক্রিয়ায় অথবা কনফিগারেশন ফাইলগুলোতে করা হয়।

import { Container } from 'aurelia-framework';
import { MyService } from './my-service';

// DI কনটেইনারে সার্ভিস রেজিস্টার করা
Container.instance.registerSingleton(MyService);

এখানে registerSingleton ব্যবহার করা হয়েছে, যার মানে হল যে MyService সার্ভিসটি একবারই ইনস্ট্যানশিয়েট হবে এবং একই ইনস্ট্যান্স অ্যাপ্লিকেশনে সব জায়গায় ব্যবহার করা যাবে।


৪. সার্ভিস ব্যবহার করা

একবার সার্ভিস DI কনটেইনারে রেজিস্টার হয়ে গেলে, আপনি যেকোনো ক্লাস বা কম্পোনেন্টে এই সার্ভিসটি ব্যবহার করতে পারবেন।

export class App {
  static inject = [MyService];  // DI কনফিগারেশন

  constructor(myService) {
    this.myService = myService;
  }

  activate() {
    console.log(this.myService.getMessage());  // সার্ভিস থেকে মেসেজ আনার কাজ
  }
}

এখন App ক্লাসে MyService ইনজেক্ট করা হয়েছে এবং সার্ভিসের getMessage() ফাংশনটি ব্যবহার করা হয়েছে।


কনফিগারেশন ইনজেকশন

Aurelia তে কনফিগারেশন ইনজেকশন করা অনেক সহজ। আপনি Configuration নামক একটি সার্ভিস তৈরি করতে পারেন যা অ্যাপ্লিকেশনের কনফিগারেশন হ্যান্ডল করবে।

কনফিগারেশন সার্ভিস তৈরি করা:

export class ConfigurationService {
  constructor() {
    this.config = {
      apiUrl: 'https://api.example.com',
      appTitle: 'My Aurelia App'
    };
  }

  get(key) {
    return this.config[key];
  }
}

কনফিগারেশন সার্ভিস ইনজেক্ট করা:

import { ConfigurationService } from './configuration-service';

export class App {
  static inject = [ConfigurationService];  // DI কনফিগারেশন

  constructor(configService) {
    this.configService = configService;
  }

  activate() {
    console.log(`API URL: ${this.configService.get('apiUrl')}`);
    console.log(`App Title: ${this.configService.get('appTitle')}`);
  }
}

এখানে, ConfigurationService অ্যাপ্লিকেশনের কনফিগারেশন সম্পর্কিত তথ্য সরবরাহ করে এবং এটি DI কনটেইনারের মাধ্যমে App ক্লাসে ইনজেক্ট করা হয়।


Aurelia তে সার্ভিস ও কনফিগারেশন ইনজেকশন এর সুবিধাসমূহ

  1. মডুলারিটি: সার্ভিস ইনজেকশনের মাধ্যমে আপনার কোডটি আরো মডুলার হয়ে ওঠে, যা রক্ষণাবেক্ষণ এবং পুনঃব্যবহারের জন্য সুবিধাজনক।
  2. টেস্টেবিলিটি: DI সিস্টেমের মাধ্যমে সহজে মক বা স্টাব ব্যবহার করে টেস্টিং করা সম্ভব, কারণ প্রতিটি ডিপেনডেন্সি ইনজেক্ট করা হচ্ছে।
  3. কনফিগারেশন ম্যানেজমেন্ট: অ্যাপ্লিকেশনের কনফিগারেশন এবং সার্ভিসের ব্যবস্থাপনা আরও সহজ হয় এবং এটি ডেভেলপমেন্ট প্রক্রিয়ায় সহায়ক হয়।
  4. ফ্লেক্সিবিলিটি: DI সিস্টেমের মাধ্যমে আপনাকে নির্দিষ্ট সার্ভিস এবং ডিপেনডেন্সি নির্ধারণ করতে হয় না, এতে আপনার অ্যাপ্লিকেশন আরও ফ্লেক্সিবল হয়ে ওঠে।

উপসংহার

Aurelia এর ডিপেনডেন্সি ইনজেকশন সিস্টেম ব্যবহারের মাধ্যমে আপনি সার্ভিস এবং কনফিগারেশন ইনজেক্ট করতে পারেন যা অ্যাপ্লিকেশনের স্কেলযোগ্যতা এবং মডুলারিটি বৃদ্ধি করে। এর মাধ্যমে অ্যাপ্লিকেশনের কনফিগারেশন এবং ডেটা ম্যানেজমেন্ট সহজ হয়ে ওঠে এবং কোডের পুনঃব্যবহারযোগ্যতা নিশ্চিত হয়।

Content added By

Aurelia-এ Dependency Injection (DI) সিস্টেম ব্যবহার করে আপনি বিভিন্ন সেবা (services) এবং কম্পোনেন্টগুলিকে একে অপরের মধ্যে ইনজেক্ট করতে পারেন। এতে কোডের মডুলারিটি, পুনরায় ব্যবহারযোগ্যতা এবং টেস্টেবিলিটি বৃদ্ধি পায়। কখনও কখনও আপনার নিজের কাস্টম ইনজেক্টর তৈরি করা প্রয়োজন হতে পারে যা নির্দিষ্ট কার্যকারিতা বা কনফিগারেশন প্রদান করবে।

Aurelia-এ কাস্টম ইনজেক্টর তৈরি করার জন্য আপনাকে কেবল @injectable ডেকোরেটর এবং Container সিস্টেম ব্যবহার করতে হবে। এখানে কাস্টম ইনজেক্টরের একটি মৌলিক উদাহরণ দেওয়া হলো।


১. কাস্টম ইনজেক্টর তৈরি করা

প্রথমে একটি service বা injectable class তৈরি করুন, যা আমরা কাস্টম ইনজেক্টর হিসেবে ব্যবহার করব।

১.১ সেবা তৈরি করা (Service)

ধরা যাক, আমাদের একটি LoggerService তৈরি করতে হবে যা লগিংয়ের জন্য ব্যবহৃত হবে।

// src/logger.service.js
export class LoggerService {
  log(message) {
    console.log("Log message: ", message);
  }
}

এখন LoggerService একটি সাধারণ ক্লাস যা একটি log মেথড প্রদান করে, যা কনসোলে মেসেজ লগ করবে।


২. কাস্টম ইনজেক্টর তৈরি করা

Aurelia-এ @injectable ডেকোরেটর ব্যবহার করে সেবা (service) বা ক্লাসকে ইনজেক্টর হিসেবে তৈরি করা হয়। এটি আমাদের LoggerService ক্লাসে যুক্ত করতে হবে, যাতে আমরা এটিকে অন্য কোথাও ইনজেক্ট করতে পারি।

২.১ LoggerService-এ @injectable ডেকোরেটর যোগ করা

// src/logger.service.js
import { inject } from 'aurelia-framework';

@inject()
export class LoggerService {
  log(message) {
    console.log("Log message: ", message);
  }
}

এখন LoggerService ক্লাসটি @injectable হিসেবে প্রস্তুত। আমরা এই ক্লাসটিকে যেকোনো কম্পোনেন্ট বা ক্লাসে ইনজেক্ট করতে পারি।


৩. কাস্টম ইনজেক্টর ব্যবহার করা

কাস্টম ইনজেক্টর ব্যবহার করার জন্য, আপনি আপনার কম্পোনেন্ট বা ভিউমডেলে সেই সেবা ইনজেক্ট করবেন।

৩.১ LoggerService ইনজেক্ট করা

ধরা যাক, আপনার App কম্পোনেন্টে LoggerService ইনজেক্ট করতে চান।

// src/app.js
import { inject } from 'aurelia-framework';
import { LoggerService } from './logger.service';

@inject(LoggerService)
export class App {
  constructor(logger) {
    this.logger = logger;
  }

  attached() {
    this.logger.log("Aurelia App Loaded Successfully!");
  }
}

এখানে, LoggerService কে ইনজেক্ট করা হয়েছে App ক্লাসে। যখন অ্যাপ্লিকেশনটি লোড হবে, তখন this.logger.log() কল করা হবে এবং কনসোলে একটি মেসেজ প্রদর্শিত হবে।


৪. কাস্টম ইনজেক্টর কনফিগারেশন

Aurelia ইনজেকশন কনটেইনার ব্যবহার করে ইনজেক্টরের কনফিগারেশন করে থাকে। আপনি যদি কাস্টম কনফিগারেশন করতে চান, যেমন ইনস্ট্যান্স বা স্ট্যাটিক ডেটা ইনজেক্ট করতে চান, তবে সেটাও করা যায়।

৪.১ কাস্টম ইনজেক্টর কনফিগারেশন

// src/logger.service.js
export class LoggerService {
  constructor(config) {
    this.config = config || 'Default Config';
  }

  log(message) {
    console.log(`[${this.config}] Log message: ${message}`);
  }
}

এখন এই সেবা ইনজেক্ট করতে হবে, তবে ইনজেকশনে কাস্টম কনফিগারেশন পাস করতে হবে।

// src/app.js
import { inject } from 'aurelia-framework';
import { LoggerService } from './logger.service';

@inject(LoggerService)
export class App {
  constructor(logger) {
    this.logger = logger;
  }

  attached() {
    this.logger.log("Custom Configured Logger Service");
  }
}

এটি কাস্টম ইনজেকশনের মাধ্যমে LoggerService কনফিগারেশন মান পাস করে এবং লগ মেসেজ কনসোলে প্রদর্শন করবে।


৫. সার্ভিস কনটেইনার (Container) ব্যবহার করা

Aurelia এর Container API দিয়ে আপনি ম্যানুয়ালি ডিপেনডেন্সি ইনজেকশন করতে পারেন। এটি তখন কার্যকর হয় যখন আপনি কোনো ক্লাসের মধ্যে নির্দিষ্ট ইনজেকশন কনফিগার করতে চান।

import { Container } from 'aurelia-framework';
import { LoggerService } from './logger.service';

const container = new Container();
const logger = container.get(LoggerService);
logger.log("LoggerService instantiated manually!");

এটি আপনার সার্ভিস কন্টেইনারকে ব্যবহার করে LoggerService এর ইনস্ট্যান্স তৈরি করবে এবং লগ মেসেজটি কনসোলে দেখাবে।


উপসংহার

Aurelia-এ কাস্টম ইনজেক্টর তৈরি করা খুবই সহজ এবং আপনাকে @inject ডেকোরেটর ব্যবহার করতে হবে। আপনি কাস্টম ইনজেক্টর ব্যবহার করে আপনার অ্যাপ্লিকেশনের ডিপেনডেন্সি ইনজেকশন সিস্টেম আরও শক্তিশালী এবং মডুলার করতে পারেন। এটি কোডের পুনরায় ব্যবহারযোগ্যতা, মডুলারিটি এবং টেস্টেবিলিটি বাড়াতে সহায়তা করে।

Content added By

Aurelia ফ্রেমওয়ার্কে লাইফটাইম এবং স্কোপ কনফিগারেশন একটি অত্যন্ত গুরুত্বপূর্ণ বিষয়, যা কম্পোনেন্ট, সার্ভিস এবং ডিপেনডেন্সি ইনজেকশন (DI) সিস্টেমের কার্যকারিতা এবং ব্যবস্থাপনা নির্ধারণ করে। এটি আপনার অ্যাপ্লিকেশনে ডিপেনডেন্সি পরিচালনার সুবিধা দেয় এবং নিশ্চিত করে যে আপনি প্রতিটি কম্পোনেন্ট বা সার্ভিসের জন্য সঠিক লাইফটাইম বা স্কোপ পছন্দ করেছেন। এই বিষয়টি বিশেষভাবে বড় অ্যাপ্লিকেশন এবং সিস্টেমে কার্যকরী।

Aurelia DI (Dependency Injection) কনটেইনারের মাধ্যমে লাইফটাইম এবং স্কোপ কনফিগারেশন পরিচালনা করা হয়। DI কনটেইনার আপনাকে এই সিদ্ধান্ত নিতে দেয় যে আপনি আপনার সার্ভিস বা কম্পোনেন্টগুলিকে কিভাবে ইনস্ট্যানশিয়েট করতে চান এবং তাদের লাইফটাইম (যতবার প্রয়োজন হবে তা তৈরি করা হবে অথবা একবার তৈরি হয়ে অ্যাপ্লিকেশন শেষ না হওয়া পর্যন্ত থাকবে)।


লাইফটাইম (Lifetime) কনফিগারেশন

লাইফটাইম কনফিগারেশন মূলত এই বিষয়টি নির্ধারণ করে যে, নির্দিষ্ট সার্ভিস বা কম্পোনেন্ট কতদিন জীবিত থাকবে এবং কখন পুনরায় ইনস্ট্যানশিয়েট করা হবে। Aurelia DI সিস্টেমে বিভিন্ন লাইফটাইম স্ট্র্যাটেজি আছে:

১. Transient (ট্রানজিয়েন্ট)

  • ট্রানজিয়েন্ট লাইফটাইম এর মাধ্যমে সার্ভিস প্রতিবার ইনজেক্ট করা হলে নতুন একটি ইনস্ট্যান্স তৈরি করা হয়।
  • যদি একটি সার্ভিস এমনভাবে কনফিগার করা হয় যাতে এটি ট্রানজিয়েন্ট হয়, তাহলে প্রতি কম্পোনেন্ট বা কনট্রোলার যখন সেই সার্ভিসকে ইনজেক্ট করবে, তখন নতুন একটি ইনস্ট্যান্স তৈরি হবে।

কিভাবে কনফিগার করবেন:

import { inject } from 'aurelia-framework';

@inject(SomeService)
export class SomeComponent {
  constructor(someService) {
    this.someService = someService;
  }
}

২. Singleton (সিঙ্গেলটন)

  • সিঙ্গেলটন লাইফটাইম এর মাধ্যমে সার্ভিসটি একবার তৈরি হবে এবং পুরো অ্যাপ্লিকেশন জুড়ে একই ইনস্ট্যান্স ব্যবহার হবে।
  • সাধারণত অ্যাপ্লিকেশনের গ্লোবাল স্টেট বা ডেটা ম্যানেজমেন্টের জন্য সিঙ্গেলটন সার্ভিস ব্যবহার করা হয়, যেখানে সার্ভিসটির একাধিক কপি থাকা প্রয়োজন হয় না।

কিভাবে কনফিগার করবেন:

import { inject } from 'aurelia-framework';

@inject(SomeService)
export class SomeComponent {
  constructor(someService) {
    this.someService = someService;
  }
}

Aurelia ডিফল্টভাবে সিঙ্গেলটন লাইফটাইম ব্যবহার করে, অর্থাৎ যখন একটি সার্ভিস ইনজেক্ট করা হয়, তখন এটি একটি একক ইনস্ট্যান্স তৈরি করে এবং সারা অ্যাপ্লিকেশনের মধ্যে ব্যবহৃত হয়।

৩. Scoped (স্কোপড)

  • স্কোপড লাইফটাইম এর মাধ্যমে সার্ভিসটি একটি নির্দিষ্ট স্কোপের মধ্যে ইনস্ট্যানশিয়েট হয় এবং যখন সেই স্কোপ শেষ হয়, তখন সার্ভিসের ইনস্ট্যান্সটিও শেষ হয়ে যায়। সাধারণত এটি রুট বা ভিউ স্কোপে ব্যবহৃত হয়।
  • এটি বিভিন্ন দৃশ্য বা রাউটের মধ্যে সার্ভিসের ভিন্ন ভিন্ন ইনস্ট্যান্স ব্যবহার করতে সহায়তা করে।

কিভাবে কনফিগার করবেন:

import { inject } from 'aurelia-framework';

@inject(SomeService)
export class SomeComponent {
  constructor(someService) {
    this.someService = someService;
  }
}

স্কোপ (Scope) কনফিগারেশন

স্কোপ কনফিগারেশন আপনাকে নির্দিষ্ট করে দিতে দেয় যে কোন ডিপেনডেন্সি কোন স্কোপ বা কনটেক্সটে ইনস্ট্যানশিয়েট হবে। স্কোপ হল সার্ভিস বা কম্পোনেন্টের জীবনকাল কিভাবে পরিচালনা করা হবে এবং কতটুকু সীমিত হবে।

১. রুট স্কোপ (Root Scope)

  • রুট স্কোপ একটি অ্যাপ্লিকেশনের মূল স্কোপ, যেখানে সমস্ত সার্ভিস এবং কম্পোনেন্ট গ্লোবালি অ্যাক্সেসযোগ্য।
  • সাধারণত এই স্কোপে আপনি এমন সার্ভিসগুলো ইনজেক্ট করবেন যা গ্লোবাল ডেটা বা অ্যাপ্লিকেশনের কার্যক্রম পরিচালনা করবে।

২. ভিউ স্কোপ (View Scope)

  • ভিউ স্কোপ একটি নির্দিষ্ট ভিউ বা কম্পোনেন্টের জন্য স্কোপ তৈরি করে, যেখানে সার্ভিস শুধুমাত্র সেই ভিউর মধ্যে ব্যবহৃত হবে।
  • এটি ব্যবহার করলে, সার্ভিসটির জীবনকাল নির্দিষ্ট ভিউ বা কম্পোনেন্টের মধ্যে সীমাবদ্ধ থাকবে।

৩. ভিউমডেল স্কোপ (ViewModel Scope)

  • যখন আপনি একটি ভিউ বা কম্পোনেন্ট তৈরি করেন, তখন সেই ভিউর সাথে সম্পর্কিত ভিউমডেল একটি নতুন স্কোপে কাজ করবে। এর মাধ্যমে আপনি সেই স্কোপের জন্য বিশেষ সার্ভিস এবং ডিপেনডেন্সি ইনজেক্ট করতে পারেন।

Dependency Injection কনফিগারেশন উদাহরণ

Aurelia-তে একটি সাধারণ dependency injection কনফিগারেশন উদাহরণ দেওয়া হলো:

import { inject } from 'aurelia-framework';
import { SomeService } from './some-service';

@inject(SomeService)
export class App {
  constructor(someService) {
    this.someService = someService;
  }
  
  activate() {
    console.log(this.someService.getData());
  }
}

এখানে, SomeService সার্ভিসটি ট্রানজিয়েন্ট বা সিঙ্গেলটন হিসেবে কনফিগার করা হতে পারে, যা নির্ভর করবে আপনার ব্যবহারের চাহিদার উপর।


উপসংহার

Aurelia-তে লাইফটাইম এবং স্কোপ কনফিগারেশন ডিপেনডেন্সি ইনজেকশনের মাধ্যমে অ্যাপ্লিকেশনের কার্যকারিতা এবং কর্মক্ষমতা নির্ধারণ করে। এটি আপনাকে বিশেষভাবে ট্রানজিয়েন্ট, সিঙ্গেলটন, এবং স্কোপড লাইফটাইম কনফিগারেশনগুলির মাধ্যমে আপনার ডিপেনডেন্সি পরিচালনা করতে সহায়তা করে। এর মাধ্যমে আপনি আপনার অ্যাপ্লিকেশনের ইনস্ট্যান্স এবং সার্ভিসের জীবনকাল নিয়ন্ত্রণ করতে পারেন, যা অ্যাপ্লিকেশনের কার্যকারিতা এবং সাশ্রয়ী সম্পদের ব্যবহার নিশ্চিত করে।

Content added By
Promotion

Are you sure to start over?

Loading...