امروز در سلسله مقالات آموزش asp.net core دانشجویار به معرفی تزریق وابستگی در asp.net core پرداخته ایم.

درباره تزریق وابستگی چه می‌دانید؟ آیا تاکنون تجربه تزریق وابستگی را داشته‌اید و با مزایای آن آشنا هستید؟ در این متن سعی شده است تا مطالب مفید و کاملی را درباره تزریق وابستگی توضیح دهیم تا اگر شما برنامه‌نویس تازه کاری هستید و یا علاقه دارید به دنیای برنامه‌نویسی و کدنویسی وارد شوید، با دانستن این اطلاعات بتوانید مهارت و تکنیک خود را حرفه‌ای و تخصصی‌تر کنید. بهتر است بدانید که تزریق وابستگی در asp.net core بسیار ساده‌تر و راحت‌تر از نسخه‌های پیشین است و به همین دلیل اگر مواردی که در ادامه گفته شده است را به ذهن بسپارید، می‌توانید زمانی که قصد تزریق وابستگی از روش سازنده کلاس را ندارید، از آن برای ارسال و پردازش وابستگی‌ها استفاده کنید. بنابراین تا انتهای متن همراه ما باشید.

تزریق وابستگی در asp.net core چیست؟

در ابتدا بهتر است با مفهوم تزریق وابستگی آشنا شوید. تزریق وابستگی یا Dependency Injection که به اختصار به آن DI نیز گفته می‌شود، درحقیقت یک نوع وارونگی کنترل یا Inversion of Control در برنامه‌نویسی است. این الگو طراحی باعث می‌شود که یک کلاس یا شی بتواند توابع و وابستگی‌های خود را با استفاده از یک رابط به موضوع یا کلاس دیگری تزریق و ارسال کند.

برای انجام کارهایی که در asp.net core انجام می‌شود، مانند ساخت برنامه مقیاس‌پذیر، کاهش وابستگی در کلاس‌ها و… باید از تزریق وابستگی استفاده کرده تا بدون نیاز به تغییر کلاس‌ها بتوانید تغییراتی در ساختار خود ایجاد کنید. بهتر است به این موضوع نیز اشاره شود که در asp.net core دیگر نیاز نیست مانند سری‌های قبلی asp.net از کتابخانه‌های دیگر برای تزریق وابستگی استفاده کنید، زیرا در این نسخه به صورت پیش فرض مکانیزمی برای این کار طراحی و جایگذاری شده است.

تزریق وابستگی در asp.net core

معرفی انواع راه‌های تزریق وابستگی

به صورت کلی تزریق وابستگی در asp.net core از سه طریق انجام می‌شود که در ادامه با هر روش به طور کامل آشنا خواهید شد:

  • Scoped: در این روش شما می‌توانید فقط یک نمونه از کلاس موردنظر را ایجاد و آن را در بین سایر کلاس‌ها به اشتراک بگذارید. به عنوان مثال اگر شما برای یک کلاس ۱۰ درخواست داشته باشید، تنها یک نمونه از آن کلاس ایجاد خواهد شد. همچنین به این نکته توجه کنید که در هنگام استفاده از روش Scoped باید آن را به متد InvokeAsync یا Invoke تزریق کرده و اگر از راه تزریق در سازنده یا constructor injection این انتقال را انجام دهید، سرویس خود را مجبور می‌کنید که رفتاری مشابه Singleton پیدا کند.
  • Singleton: روش Singleton بسیار ساده بوده که فقط یک نمونه از آن ساخته می‌شود که در تمام طول عمر نرم‌افزار می‌توانید از آن در کلاس‌های دیگری که برای استفاده از این متد تقاضا کرده باشند، نمونه را تزریق کنید. همچنین اگر برنامه شما نیاز به Singleton داشته باشد، بهتر است مدیریت طول عمر سرویس‌ها را به service container بسپارید و به جای استفاده از الگوی singleton باید کد کاربر را برای مدیریت طول عمر آبجکت در کلاس موردنظر وارد کنید. البته به یاد داشته باشید که اگر برای مدیریت سرویس scoped، راه singleton را انتخاب کنید، ممکن است کلاس موردنظر شما در incorrect state قرار گرفته و در هنگام پردازش و تزریق‌های بعدی با مشکل مواجه شوید.
  • Transient: در روش تزریق وابستگی به روش Transient برای هر درخواست می‌توانید یک نمونه از کلاس موردنظر را بسازید و آن را میان کلاس‌های دیگر به اشتراک بگذارید. برای اینکه روش Transient را بهتر متوجه شوید، باید گفت که در صورتی که ۱۰ درخواست وجود داشته باشد، یعنی ۱۰ نمونه از آن کلاس نیز ایجاد خواهد شد. معنی کلمه این روش گذرا و فانی است و به همین دلیل هر زمان و در هر موقعیتی که درخواست وجود داشته باشد، در همان مکان ساخته خواهند شد. Transient معمولا برای سرویس‌هایی استفاده می‌شود که بی‌ وضعیت و سبک هستند.

مزایای استفاده از تزریق وابستگی چیست؟

استفاده از تزریق وابستگی می‌تواند مزیت‌های بسیاری در هنگام برنامه‌نویسی و کدنویسی داشته باشد که در ادامه به تعدادی از این مزایا اشاره شده است:

  • با استفاده از این روش شما می‌توانید در بیرون از کلاس‌هایی که استفاده می‌کنید نیز این وابستگی را کنترل و مدیریت کنید. به صورت کلی این کنترل در بخش مرکزی مانند IoC container انجام خواهد شد و دیگر نیاز نیست آن را در طول اجرای برنامه انجام دهید.
  • شما می‌توانید هر کلاس را به صورت مستقل تست و آزمایش کنید. زیرا شما به جای اینکه یک روش پیاده‌سازی مشخصی را انتخاب کنید، می‌توانید یک آبجکت تقلیدی را به سازنده کلاس تزریق کنید.

مثالی برای تزریق وابستگی در asp.net core

برای اینکه تزریق وابستگی در asp.net core را به صورت کامل و بهتر متوجه شوید، در این قسمت با یک مثال ساده آشنا خواهید شد. ابتدا تصور کنید که شما یک کلاس MyDependency را داشته باشید و بنابراین برای اینکه از این کلاس استفاده کنید، باید یک اینترفیس بسازید.

حتما می‌دانید که اگر یک اینترفیس و کلاس با یکدیگر ترکیب شود، باعث ساخت یک سرویس می‌شود و درصورتی که بخواهید از سرویس‌ها استفاده کنید، باید تزریق وابستگی داشته باشید. در ادامه شما باید در کلاس startup.cs یک service را راه‌اندازی کنید و اگر برای این راه‌اندازی از روش Scoped استفاده کنید، می‌توانید آن را در هر کلاس دیگری پردازش کنید.

در آخر به این نکته توجه کنید که اگر در کلاس از دیتابیس استفاده کرده باشید، پیشنهاد می‌کنیم که روش تزریق وابستگی در کلاس startup.cs را مشابه با روش تزریق وابستگی در دیتابیس انتخاب کنید تا مشکلی مانند اسارت وابستگی برای شما ایجاد نشود. همچنین در هنگام برنامه‌نویسی و کدنویسی فراموش نکنید که طول عمر کلاس‌های شما باید کمتر یا مساوی با طول عمر وابستگی‌های استفاده شده در آن باشد.

سخن پایانی

اکنون که با تزریق وابستگی در asp.net core آشنا شدید، باید بدانید که استفاده از این سرویس‌ها می‌تواند چقدر برای یک برنامه‌نویس مفید باشد و کار کدنویسی را برای او سریع‌تر کند، زیرا دیگر نیاز به تنظیمات دستی نیست و یک بخش کنترل‌کننده می‌تواند به بهترین شکل تزریق وابستگی را در کلاس‌های مختلف انجام دهد. اما اگر می‌خواهید با خطا و مشکلاتی در هنگام کار مواجه نشوید، حتما نکات گفته شده مانند طول عمر وابستگی و کلاس‌ها، روش تزریق وابستگی و… را درنظر بگیرید.