ডিপেনডেন্সি ইনজেকশন (DI) হলো ডিজাইন প্যাটার্ন, যা একটি ক্লাসের প্রয়োজনীয় ডিপেনডেন্সিগুলো বাইরের কোড থেকে সরবরাহ করে। এটি কোডের সংযোগ (coupling) কমিয়ে দেয়, কোডকে সহজে টেস্ট করা এবং মডুলার করতে সাহায্য করে। DI মূলত SOLID ডিজাইন প্রিন্সিপালের D (Dependency Inversion Principle) ফলো করে।
ডিপেনডেন্সি ইনজেকশনের ধরন
Constructor Injection: কনস্ট্রাক্টরের মাধ্যমে ডিপেনডেন্সি প্রদান করা হয়। এটি সবচেয়ে সাধারণ এবং সেফ ইনজেকশন মেথড।
উদাহরণ:
class DataManager {
private let databaseService: DatabaseService
init(databaseService: DatabaseService) {
self.databaseService = databaseService
}
func loadData() {
databaseService.fetchData()
}
}
Property Injection: ক্লাস তৈরি করার পরে প্রপার্টি অ্যাক্সেস করে ডিপেনডেন্সি প্রদান করা হয়। এটি সাধারণত ঐচ্ছিক ডিপেনডেন্সির জন্য ব্যবহৃত হয়।
উদাহরণ:
class DataManager {
var databaseService: DatabaseService?
func loadData() {
databaseService?.fetchData()
}
}
let dataManager = DataManager()
dataManager.databaseService = RealDatabaseService()
Method Injection: মেথড কল করার সময় ডিপেনডেন্সি ইনজেক্ট করা হয়।
উদাহরণ:
class DataManager {
func loadData(with service: DatabaseService) {
service.fetchData()
}
}
let dataManager = DataManager()
dataManager.loadData(with: RealDatabaseService())
ডিপেনডেন্সি ইনজেকশনের সুবিধা
- কোড পুনঃব্যবহারযোগ্যতা: ডিপেনডেন্সিগুলো বাইরের থেকে সরবরাহ করা হলে, কোড সহজে নতুন পরিবেশে ব্যবহার করা যায়।
- ইউনিট টেস্ট সহজ করা: স্টাব বা মক ব্যবহার করে ইউনিট টেস্ট করা সহজ হয়।
- কম্পোনেন্টের মধ্যে সংযোগ কমানো: কোডের মডিউল গুলোকে সহজেই পৃথক এবং মডুলার রাখা যায়।
DI কনটেইনার
Swift-এ ডিপেনডেন্সি ইনজেকশন কনটেইনার (DI Container) একটি ফ্রেমওয়ার্ক হিসেবে ব্যবহৃত হয়, যা বিভিন্ন অবজেক্টের ডিপেনডেন্সিগুলো ম্যানেজ করে। Popula DI কন্টেইনার হিসেবে Swinject ব্যবহৃত হয়।
import Swinject
let container = Container()
container.register(DatabaseService.self) { _ in RealDatabaseService() }
let dataManager = container.resolve(DatabaseService.self)
ডিপেনডেন্সি ইনজেকশন কোডকে ক্লিন, মডুলার এবং রিইউজেবল করতে কার্যকরী। Swift-এ DI ব্যবহার করে উন্নত ও টেস্টেবল কোড বেস তৈরি করা যায়।