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 কনটেইনারের ফিচার
- সিঙ্গেলটন (Singleton) রেজিস্ট্রেশন:
- DI কনটেইনারে সার্ভিসগুলিকে সিঙ্গেলটন হিসেবে রেজিস্টার করা যায়, যা সার্ভিসটির একক ইনস্ট্যান্স তৈরি করে এবং পরবর্তীতে সেই একক ইনস্ট্যান্স ব্যবহার করে।
উদাহরণ:
container.registerSingleton(MyService);
- ট্রান্সিয়েন্ট রেজিস্ট্রেশন:
- ট্রান্সিয়েন্ট রেজিস্ট্রেশন মানে, প্রতিটি নতুন ইনস্ট্যান্সের জন্য একটি নতুন অবজেক্ট তৈরি করা।
উদাহরণ:
container.registerTransient(MyService);
- ফ্যাক্টরি রেজিস্ট্রেশন:
- আপনি একটি ফ্যাক্টরি ফাংশন ব্যবহার করে ডাইনামিকভাবে ডিপেনডেন্সি রেজিস্টার করতে পারেন।
উদাহরণ:
container.registerHandler(MyService, () => new MyService());
- নেস্টেড ইনজেকশন:
- DI কনটেইনারের মধ্যে নেস্টেড ইনজেকশন বা সিড্যিপেনডেন্সি ইনজেকশন করা সম্ভব। অর্থাৎ একটি সার্ভিসের মধ্যে অন্য একটি সার্ভিস ইনজেক্ট করা।
Aurelia DI কনটেইনারের সুবিধাসমূহ
- কোডের মডুলারিটি বৃদ্ধি: DI ব্যবহারের মাধ্যমে আপনি আপনার কোডের বিভিন্ন অংশ আলাদা করে রাখতে পারেন, যা সহজে রিইউজেবল এবং মেইনটেইনেবল হয়।
- টেস্টযোগ্যতা (Testability): DI সিস্টেমের মাধ্যমে সহজেই ইউনিট টেস্টিং করা যায়, কারণ আপনি নির্দিষ্ট সার্ভিস বা ডিপেনডেন্সি সরবরাহ করতে পারেন, যা টেস্টিংয়ে সহায়তা করে।
- নির্ভরশীলতা কমানো (Loose Coupling): DI ব্যবহারের মাধ্যমে অবজেক্টগুলোর মধ্যে শক্তিশালী নির্ভরশীলতা কমানো যায়, যা কোডের পরিবর্তন এবং এক্সটেনশন সহজ করে তোলে।
- সহজ ডিপেনডেন্সি ম্যানেজমেন্ট: DI কনটেইনার আপনাকে আপনার অ্যাপ্লিকেশনের ডিপেনডেন্সি গুলো পরিচালনা করতে সহায়তা করে, যা কোডের গঠন সহজ করে তোলে।
উপসংহার
Aurelia এর ডিপেনডেন্সি ইনজেকশন কনটেইনার একটি শক্তিশালী বৈশিষ্ট্য যা অ্যাপ্লিকেশনের কোডকে আরও মডুলার, টেস্টেবল এবং রিইউজেবল করে তোলে। এটি ডিপেনডেন্সি ইনজেকশন প্যাটার্ন অনুসরণ করে, যার মাধ্যমে আপনি সার্ভিস বা ক্লাসগুলোর মধ্যে প্রয়োজনীয় ডিপেনডেন্সি সঠিকভাবে ইনজেক্ট করতে পারেন, এবং এর ফলে কোডের মান এবং রক্ষণাবেক্ষণ ক্ষমতা বৃদ্ধি পায়।