Dependency Injection (DI) হল একটি ডিজাইন প্যাটার্ন যা কোডে ডিপেনডেন্সি (যেমন, সার্ভিস, লাইব্রেরি, ডাটাবেস সেশনের মত বাহ্যিক উপাদান) ইনজেক্ট করতে ব্যবহৃত হয়, যাতে কোডের বিভিন্ন অংশের মধ্যে দৃঢ় সংযুক্তি (tight coupling) না থাকে। এটি কোডকে আরো মডুলার, টেস্টেবল, এবং পুনঃব্যবহারযোগ্য করে তোলে।
FastAPI তে Dependency Injection খুব সহজ এবং শক্তিশালী ভাবে ব্যবহৃত হয়। FastAPI স্বয়ংক্রিয়ভাবে ডিপেনডেন্সি ইনজেকশন করে, যা আপনার API-এর কোডকে পরিষ্কার, সংক্ষিপ্ত, এবং সহজবোধ্য করে তোলে।
Dependency Injection কী?
Dependency Injection (DI) হল এমন একটি পদ্ধতি যেখানে কোন ক্লাস বা ফাংশনের ডিপেনডেন্সি (যেমন: ডাটাবেস কানেকশন, লগিং, বা ইউটিলিটি ফাংশন) বাইরে থেকে সরবরাহ করা হয়, যেটি ক্লাস বা ফাংশন নিজে তৈরি বা পরিচালনা করে না। এর ফলে, কোডের পুনঃব্যবহারযোগ্যতা বৃদ্ধি পায় এবং টেস্টিং সহজ হয়।
Dependency Injection FastAPI-তে কিভাবে কাজ করে?
FastAPI তে, আপনি Dependency তৈরি করেন এবং তারপর সেই ডিপেনডেন্সি আপনার API রাউটস বা এন্ডপয়েন্টে ব্যবহার করতে পারেন। FastAPI Dependency Injection এর জন্য একটি খুব শক্তিশালী এবং স্বয়ংক্রিয় সিস্টেম প্রদান করে।
উদাহরণ:
from fastapi import FastAPI, Depends
app = FastAPI()
# Dependency তৈরি
def get_query_param(q: str = "default"):
return {"query": q}
@app.get("/items/")
def read_item(query: dict = Depends(get_query_param)):
return query
এখানে:
get_query_paramহল একটি ডিপেনডেন্সি ফাংশন।Depends(get_query_param)ব্যবহার করে FastAPI স্বয়ংক্রিয়ভাবে এই ফাংশনটি ইনজেক্ট করে।
রিকোয়েস্ট উদাহরণ:
GET /items/?q=example
রেসপন্স:
{
"query": "example"
}
FastAPI তে Dependency Injection কিভাবে কাজ করে?
- Dependency ফাংশন তৈরি করা:
প্রথমে আপনি একটি ফাংশন বা ক্লাস তৈরি করেন যা আপনার ডিপেনডেন্সি সরবরাহ করবে। এটি সাধারণতDependsদ্বারা নির্দেশিত হয়। এই ফাংশন বা ক্লাসটি রিকোয়েস্টের আগে FastAPI এর মাধ্যমে ইনজেক্ট করা হয়। Dependsব্যবহার:Dependsব্যবহার করে আপনি ফাংশন বা ক্লাসে ডিপেনডেন্সি ইনজেক্ট করতে পারেন। FastAPI তারপর আপনার ডিপেনডেন্সি স্বয়ংক্রিয়ভাবে ইনস্ট্যান্সিয়েট এবং ইনজেক্ট করবে, তাই আপনাকে এটির জন্য নিজে কোড লিখতে হবে না।
Dependency Injection এর সুবিধা
- কোডের পুনঃব্যবহারযোগ্যতা:
একাধিক এন্ডপয়েন্টে একই ডিপেনডেন্সি ব্যবহার করা যায়, যেমন ডাটাবেস কানেকশন বা লগিং ফাংশন। - টেস্টিং সহজ করা:
ডিপেনডেন্সি আলাদা করা থাকায় আপনি সহজেই ইউনিট টেস্ট করতে পারবেন। - কোডের পরিষ্কারতা এবং সংক্ষিপ্ততা:
ডিপেনডেন্সি আলাদাভাবে রক্ষা করা থাকলে কোড আরও পরিষ্কার, মডুলার এবং সহজবোধ্য হয়।
FastAPI তে Dependency Injection এর আরও উদাহরণ
১. ডাটাবেস কানেকশন ডিপেনডেন্সি:
from fastapi import FastAPI, Depends
app = FastAPI()
# Dummy Database dependency
def get_db():
db = "Database connection" # এখানে ডাটাবেস কানেকশন তৈরি করতে হবে
try:
yield db
finally:
pass # এখানে ডাটাবেস কানেকশন বন্ধ করার কোড হবে
@app.get("/items/")
def get_items(db: str = Depends(get_db)):
return {"db_connection": db}
এখানে, get_db ফাংশনটি একটি ডিপেনডেন্সি তৈরি করেছে, যা ডাটাবেস কানেকশন সরবরাহ করে। FastAPI Depends(get_db) ব্যবহার করে ডিপেনডেন্সিটি ইনজেক্ট করছে।
রিকোয়েস্ট উদাহরণ:
GET /items/
রেসপন্স:
{
"db_connection": "Database connection"
}
২. কাস্টম ডিপেনডেন্সি: লগিং
from fastapi import FastAPI, Depends
app = FastAPI()
# Dependency function for logging
def get_logger():
class Logger:
def log(self, message: str):
print(f"LOG: {message}")
return Logger()
@app.get("/log/")
def log_message(logger: Logger = Depends(get_logger)):
logger.log("This is a log message.")
return {"message": "Logged successfully"}
এখানে, get_logger একটি কাস্টম ডিপেনডেন্সি যা একটি Logger ক্লাসের ইনস্ট্যান্স সরবরাহ করে। এই ইনস্ট্যান্সটি log_message ফাংশনে ইনজেক্ট করা হয়।
রিকোয়েস্ট উদাহরণ:
GET /log/
রেসপন্স:
{
"message": "Logged successfully"
}
এটি কনসোলে "LOG: This is a log message." প্রিন্ট করবে।
Dependency Injection এর ডিপেনডেন্সি (চেইনিং ডিপেনডেন্সি)
FastAPI তে একটি ডিপেনডেন্সির মধ্যে অন্য একটি ডিপেনডেন্সি ইনজেক্ট করা যায়। এটি চেইনিং ডিপেনডেন্সি নামে পরিচিত।
from fastapi import FastAPI, Depends
app = FastAPI()
# First level dependency
def get_query_param(q: str = "default"):
return {"query": q}
# Second level dependency
def get_full_query(query: dict = Depends(get_query_param)):
return {**query, "status": "success"}
@app.get("/items/")
def read_item(query: dict = Depends(get_full_query)):
return query
এখানে, get_full_query ফাংশনটি get_query_param ডিপেনডেন্সিকে ইনজেক্ট করছে।
রিকোয়েস্ট উদাহরণ:
GET /items/?q=test
রেসপন্স:
{
"query": "test",
"status": "success"
}
FastAPI তে Dependency Injection একটি শক্তিশালী বৈশিষ্ট্য যা কোডের মডুলারিটি, পুনঃব্যবহারযোগ্যতা এবং টেস্টযোগ্যতা নিশ্চিত করে। এটি আপনাকে API ডেভেলপমেন্টে ডিপেনডেন্সিগুলো সহজভাবে হ্যান্ডল করার সুযোগ দেয় এবং কোডের গুণগত মান উন্নত করে। FastAPI তে Depends ব্যবহার করে আপনি খুব সহজেই ফাংশন বা ক্লাসে ডিপেনডেন্সি ইনজেক্ট করতে পারেন এবং সেই ডিপেনডেন্সির কার্যকারিতা নিশ্চিত করতে পারেন।
Read more