احتمالاً میدونید که پایتونکارها عاشق سادگی هستن و داتنت کارها (مخصوصاً بچه های ASP.NET Core) عاشق معماری های تمیز، کلاس بندی های دقیق و البته تزریق وابستگی (Dependency Injection).
حالا فکر کنید یه نفر بیاد این دو تا دنیا رو با هم ترکیب کنه؛ نتیجهاش میشه یه فریمورک فوق العاده جذاب و سریع به اسم BlackSheep(گوسفند سیاه!). تو این مقاله میخوایم خیلی خودمونی و راحت بررسی کنیم که این فریمورک چیه، چرا انقدر شبیه ASP.NET Core طراحی شده و اصلاً ارزش داره بریم سراغش یا نه.
BlackSheep چیه؟
بلک شیپ (BlackSheep) یه فریمورک وب غیرهمزمان (Asynchronous) و مبتنی بر ASGI برای پایتونه که برای ساختن وب اپلیکیشن ها و APIها استفاده میشه. سازندهی این فریمورک (Roberto Prevato) سالها تو دنیای C# و .NET کار کرده بوده و وقتی اومده سمت پایتون، دلش برای یه سری از اون ساختارهای تر و تمیز دات نتی تنگ شده. همین دلتنگی باعث شد تا فریمورکی بسازه که سرعت بینظیر پایتون های مدرن رو با معماری محکم ASP.NET ترکیب کنه.
از نظر پرفورمنس، BlackSheep یکی از سریعترین فریمورک های پایتونه (حتی تو بنچمارک ها در رقابت تنگاتنگ با FastAPI و گاهی بالاتر از اون قرار میگیره)، چون هستهی اصلیش با Cython نوشته شده.
چرا میگیم بوی ASP.NET Core میده؟
بذارید چند تا از ویژگیهایی که باعث میشه یه داتنتکار با دیدن BlackSheep لبخند بزنه رو با هم مرور کنیم:
۱. تزریق وابستگی (Dependency Injection) به عنوان شهروند درجه یک!
تو فریمورکهایی مثل Flask یا FastAPI، معمولاً DI رو باید با ترفند های مختلف یا کتابخونه های جانبی پیاده کنید. اما تو BlackSheep، مفهوم Container و تزریق وابستگی دقیقاً مثل کانتینر پیشفرض ASP.NET Core (همون IServiceCollection) تو دل فریمورک جاسازی شده. شما خیلی راحت سرویس هاتون رو به شکلهای Singleton، Transient یا Scoped رجیستر میکنید و فریمورک خودش زحمت پاس دادن اونا رو به کنترلرها میکشه.
۲. کنترلرها و روتینگ آشنا
اگر با معماری MVC یا Web API تو داتنت کار کرده باشید، با کلاس هایی که نقش Controller رو دارن آشنایید. تو BlackSheep هم میتونید کلاس های کنترلر بسازید و متدهاتون رو با دکوراتورهای ساده (مثل [HttpGet] تو سیشارپ که اینجا میشه @get) روتینگ کنید:
from blacksheep import get
from blacksheep.server.controllers import Controller
class UsersController(Controller):
@get("/api/users/{user_id}")
async def get_user(self, user_id: int, db_service: DatabaseService):
# اینجا db_service به صورت خودکار از طریق DI تزریق شده!
return await db_service.find_user(user_id)
۳. بایندینگ خودکار مدلها (Model Binding)
دقیقاً مثل ASP.NET Core که میتونه دیتای ورودی (از Query String، Body یا Route) رو بر اساس تایپ هایی که تعریف کردید بخونه و تبدیل کنه، BlackSheep هم از Type Hintهای پایتون استفاده میکنه تا دقیقاً همین کار رو انجام بده. اگر ورودی شما یه کلاس Pydantic یا یه Dataclass باشه، خودش ریکوئست رو پردازش و ولیدیت میکنه و به عنوان یه آبجکت تمیز بهتون تحویل میده.
مقایسه با غولهای بازار (FastAPI و Django)
-
در برابر FastAPI: از نظر عملکرد و استفاده از تایپهینتها خیلی به FastAPI شبیهه. تفاوت اصلی تو معماریه. FastAPI بیشتر روی توابع ساده و
Dependsتمرکز داره، در حالی که BlackSheep شما رو به سمت کلاسها، کپسولهسازی (Encapsulation) و یک DI Container مرکزی سوق میده. -
در برابر Django: جنگو یه ابزار "همه چی تمومه" (Batteries-included) که با ORM و پنل ادمین خودش میاد. BlackSheep یه میکروفریمورکه؛ یعنی شما آزادی عمل دارید که ORM (مثل SQLAlchemy) یا ابزارهای دلخواهتون رو خودتون انتخاب کنید و کنار هم بچینید.
بالاخره بریم سراغش یا نه؟
براتون عالیه اگر:
-
از دنیای C# و ASP.NET Core به پایتون مهاجرت کردید و دنبال یه حس آشنا میگردید.
-
پروژهای دارید که نیاز به معماری لایهبندی شده و Enterprise داره و دوست دارید کدها به شدت ماژولار و قابل تست (Testable) باشن.
-
عاشق سرعت بالا و استفاده از قابلیتهای
async/awaitتو پایتون هستید.
شاید مناسب نباشه اگر:
-
دنبال کامیونیتی خیلی بزرگ میگردید (کامیونیتی FastAPI در حال حاضر خیلی بزرگتره و پیدا کردن آموزش براش راحتتره).
-
برای ساختن یه اسکریپت ساده یا یه API دو خطی میخواید کد بزنید (اینجا سادگی Flask یا FastAPI شاید بیشتر به کار بیاد).
جمع بندی
بلکشیپ (BlackSheep) نشون داد که پایتون چقدر منعطفه و چطور میشه بهترین الگوهای طراحی (Design Patterns) زبان های دیگه رو با ظرافت وارد اکوسیستم پایتون کرد. اگر تا حالا تستش نکردید، پیشنهاد میکنم برای پروژهی تستی بعدیتون یه pip install blacksheep بزنید و از معماری تمیزش لذت ببرید!
نظرات کاربران (0)