ডিপেন্ডেন্সি ইনজেকশন (Dependency Injection) হলো একটি ডিজাইন প্যাটার্ন যা কোডের মডুলারিটি এবং টেস্টেবিলিটি উন্নত করতে সাহায্য করে। TypeScript-এ, এই প্যাটার্নটি সঠিকভাবে ব্যবহার করার জন্য সার্ভিস এবং ডিপেন্ডেন্সি ইনজেকশন টাইপিং খুবই গুরুত্বপূর্ণ। এতে কোডের বিভিন্ন অংশের মধ্যে নির্ভরতা (dependencies) সরবরাহ করা সহজ হয় এবং প্রোগ্রামটির রক্ষণাবেক্ষণ এবং স্কেলেবিলিটি বৃদ্ধি পায়।
১. সার্ভিস (Service) কী?
সার্ভিস হলো এমন একটি ক্লাস বা ফাংশন যা সাধারণত কোনও নির্দিষ্ট কাজ বা ফাংশনালিটি সম্পাদন করে, যেমন ডেটাবেস এক্সেস, লগিং, ইউজার অথেন্টিকেশন ইত্যাদি। সার্ভিস সাধারণত ব্যবহৃত হয় একাধিক অংশের মধ্যে যে সমস্ত ফাংশন বা বৈশিষ্ট্যগুলির প্রয়োজন। সার্ভিসের ব্যবহার সাধারণত ডিপেন্ডেন্সি ইনজেকশন প্যাটার্নের মাধ্যমে করা হয়, যাতে সার্ভিসটি বাইরে থেকে সরবরাহ করা হয় এবং কোডের অন্যান্য অংশের সঙ্গে যুক্ত করা যায়।
উদাহরণ:
class LoggerService {
log(message: string): void {
console.log(message);
}
}
এখানে, LoggerService একটি সার্ভিস ক্লাস, যা একটি log মেথড প্রদান করে। এই ক্লাসের কাজ হলো যে কোনো মেসেজ লগ করা।
২. ডিপেন্ডেন্সি ইনজেকশন (Dependency Injection) কী?
ডিপেন্ডেন্সি ইনজেকশন হলো একটি প্রক্রিয়া, যার মাধ্যমে একটি অবজেক্টের প্রয়োজনীয় ডিপেন্ডেন্সি বা নির্ভরতা বাইরের থেকে ইনজেক্ট করা হয়, পরিবর্তে সেটি নিজের মধ্যে তৈরি করা। এতে কোডের পুনঃব্যবহারযোগ্যতা বৃদ্ধি পায় এবং টেস্টিং সহজ হয়।
TypeScript-এ ডিপেন্ডেন্সি ইনজেকশন প্রয়োগ করতে, সাধারণত কনস্ট্রাকটর ইনজেকশন ব্যবহার করা হয়, যেখানে প্রয়োজনীয় সার্ভিসগুলো কনস্ট্রাকটরের মাধ্যমে ইনজেক্ট করা হয়।
উদাহরণ:
class AppService {
constructor(private logger: LoggerService) {}
run(): void {
this.logger.log("Application is running");
}
}
const logger = new LoggerService();
const app = new AppService(logger);
app.run(); // Output: Application is running
এখানে, AppService ক্লাসের কনস্ট্রাকটর মাধ্যমে LoggerService ইনজেক্ট করা হয়েছে। অর্থাৎ, AppService ক্লাসটি তার কাজ করার জন্য LoggerService সার্ভিসটির উপর নির্ভরশীল, এবং এই নির্ভরশীলতা বাইরের মাধ্যমে সরবরাহ করা হয়েছে।
৩. ডিপেন্ডেন্সি ইনজেকশন টাইপিং
TypeScript-এ, ডিপেন্ডেন্সি ইনজেকশন টাইপিংয়ের মাধ্যমে আপনি স্পষ্টভাবে নির্ধারণ করতে পারেন যে কনস্ট্রাকটর অথবা মেথড কোন ধরনের ডিপেন্ডেন্সি নিবে। এতে টাইপ চেকিংয়ের মাধ্যমে ভুল ডিপেন্ডেন্সি ইনজেকশন প্রতিরোধ করা যায় এবং কোডে আরও সুরক্ষা আনা যায়।
উদাহরণ:
class UserService {
constructor(private logger: LoggerService) {}
createUser(name: string): void {
this.logger.log(`Creating user: ${name}`);
// Additional logic to create user
}
}
class ProductService {
constructor(private logger: LoggerService) {}
createProduct(product: string): void {
this.logger.log(`Creating product: ${product}`);
// Additional logic to create product
}
}
// ইনস্ট্যান্স তৈরি
const loggerService = new LoggerService();
const userService = new UserService(loggerService);
const productService = new ProductService(loggerService);
// ব্যবহার
userService.createUser("Alice");
productService.createProduct("Laptop");
এখানে, UserService এবং ProductService দুইটি আলাদা সার্ভিস ক্লাস তৈরি করা হয়েছে, যেগুলোর মধ্যে LoggerService ব্যবহার হচ্ছে। LoggerService কনস্ট্রাকটর ইনজেকশন প্যাটার্নের মাধ্যমে সরবরাহ করা হচ্ছে।
৪. ডিপেন্ডেন্সি ইনজেকশন টাইপিংয়ের সুবিধা
- টাইপ সেফটি: TypeScript-এ টাইপিং ব্যবহার করে আপনি নিশ্চিত করতে পারেন যে ফাংশন বা সার্ভিস কোন ধরনের ডিপেন্ডেন্সি গ্রহণ করবে। এটি ভুল ডিপেন্ডেন্সি ইনজেকশনের ঝুঁকি কমায়।
- টেস্টেবিলিটি: ডিপেন্ডেন্সি ইনজেকশন টেস্টিং সহজ করে তোলে, কারণ আপনি নির্দিষ্ট সার্ভিসের বদলে মক অবজেক্ট ইনজেক্ট করতে পারেন।
- মডুলার কোড: ডিপেন্ডেন্সি ইনজেকশন কোডের মডুলারিটি বাড়ায়, কারণ আপনার সার্ভিসগুলো আলাদা আলাদা ভাবে নির্দিষ্ট কাজ করে এবং অন্য সার্ভিসের উপর নির্ভরশীলতা সীমিত থাকে।
৫. ডিপেন্ডেন্সি ইনজেকশন কনটেইনার
TypeScript-এ ডিপেন্ডেন্সি ইনজেকশন প্রক্রিয়া আরো সহজ করতে আপনি ডিপেন্ডেন্সি ইনজেকশন কনটেইনার ব্যবহার করতে পারেন। এটি একটি ডিপেন্ডেন্সি ম্যানেজার, যা ডিপেন্ডেন্সি গুলি ইনজেক্ট করতে সাহায্য করে। এখানে, আমরা একটি কাস্টম কনটেইনার ব্যবহার করে ডিপেন্ডেন্সি ইনজেকশন দেখবো।
উদাহরণ:
class Container {
private services: Map<any, any> = new Map();
register<T>(token: any, service: T): void {
this.services.set(token, service);
}
resolve<T>(token: any): T {
return this.services.get(token);
}
}
class App {
constructor(private logger: LoggerService) {}
start() {
this.logger.log("App has started!");
}
}
// ডিপেন্ডেন্সি কনটেইনার
const container = new Container();
const loggerService = new LoggerService();
// সার্ভিস রেজিস্টার করা
container.register(LoggerService, loggerService);
// সার্ভিস রেজলভ করা
const app = container.resolve(App);
app.start(); // Output: App has started!
এখানে, Container একটি কাস্টম কনটেইনার তৈরি করেছে যা সার্ভিসগুলো রেজিস্টার এবং রেজলভ করতে সাহায্য করে। LoggerService এবং App সার্ভিসগুলো কনটেইনারের মাধ্যমে ইনজেক্ট করা হয়েছে।
সারাংশ
TypeScript-এ ডিপেন্ডেন্সি ইনজেকশন এবং সার্ভিস টাইপিং ব্যবহার করে কোডের মডুলারিটি, টেস্টেবিলিটি এবং রক্ষণাবেক্ষণযোগ্যতা বৃদ্ধি পায়। এটি ডিপেন্ডেন্সি সরবরাহের প্রক্রিয়াকে আরো পরিষ্কার এবং নিরাপদ করে তোলে। TypeScript-এ ডিপেন্ডেন্সি ইনজেকশন কনটেইনার ব্যবহার করে আপনি এক্সটেনসিবিলিটি এবং রিইউজেবিলিটি আরও উন্নত করতে পারেন।
Read more