مفهوم تزریق وابستگی (Dependency Injection) در سی شارپ

  • چهارشنبه ۵ دی ۱۳۹۷
  • بازدید ۳۲۴ نفر

dependency injection in csharp 5204 تصویر

مفهوم تزریق وابستگی (Dependency Injection) در سی شارپ

در این مقاله با چند مثال ساده به بررسی مفهوم الگوی تزریق وابستگی یا همان Dependency Injection در زبان برنامه نویسی سی شارپ می پردازیم.

تزریق وابستگی چیست؟

Dependency Injection یک الگوی طراحی است که با هدف حذف وابستگی های موجود بین دو کلاس با استفاده از یک Interface یا همان رابط ایجاد شده است. به عبارت دیگر تزریق وابستگی به معنی تزریق وابستگی های یک کلاس به جای استفاده مستقیم از آن ها درون کلاس است.

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

  • کلاس کلاینت (Client Class): کلاسی است که به کلاس سرویس وابسته است.
  • کلاس سرویس (Service Class): کلاسی است که خدماتی را به کلاس کلاینت ارائه می کند.
  • کلاس تزریق کننده (Injector Class): کلاسی است که شیء از کلاس سرویس را به کلاس کلاینت تزریق می کند.

تصویر زیر ارتباط بین سه کلاس فوق را نشان می دهد:

dependency injection in csharp 5204 1 تصویر

همانطور که مشاهده می کنید، کلاس تزریق کننده یک شیء از کلاس سرویس ایجاد می کند و آن را به کلاس کلاینت تزریق می کند. با این روش الگوی DI مسئولیت ایجاد شیء از کلاس سرویس را خارج از کلاس کلاینت انجام می دهد.

انواع تزریق وابستگی

همانگونه که در بالا یاد گرفتید، کلاس تزریق کننده، سرویس (dependency) را به کلاینت (dependent) تزریق می کند. کلاس Injector به طور کلی می تواند به سه روش زیر وابستگی را تزریق کند.

  • تزریق سازنده (Constructor Injection)
  • تزریق پراپرتی (Property Injection)
  • تزریق متد (Method Injection)
مثال

برای درک بهتر مطالب گفته شده به مثال زیر توجه کنید که بدون الگوی وابستگی نوشته شده است.

مشکلی که در کلاس بالا وجود دارد این است که ما از DataAccessFactory در داخل کلاس CustomerBusinessLogic استفاده کرده ایم. فرض کنید پیاده سازی دیگری از رابط ICustomerDataAccess وجود دارد و ما می خواهیم از آن استفاده کنیم. در این صورت باید کد کلاس CustomerBusinessLogic را تغییر دهیم. هنگامی که از الگوی تزریق وابستگی استفاده شود، این مشکل با تزریق اشیاء از طریق سازنده، پراپرتی و یا متد حل می شود.

تصویر زیر پیاده سازی الگوی تزریق وابستگی برای مثال بالا را نشان می دهد:

dependency injection in csharp 5204 2 تصویر

همانطور که مشاهده می کنید، کلاس CustomerService به عنوان تزریق کننده عمل می کند و یک شیء از کلاس CustomerDataAccess (سرویس) را به کلاس CustomerBusinessLogic (کلاینت) تزریق می کند.

تزریق سازنده (Constructor Injection)

در این نوع تزریق، کلاس Injector سرویس (dependency) را از طریق سازنده کلاس کلاینت تزریق می کند.

در مثال زیر الگوی تزریق وابستگی با استفاده از سازنده پیاده سازی شده است:

در مثال بالا CustomerBusinessLogic شامل سازنده ای با پارامتری از نوع ICustomerDataAccess است و اکنون هر متدی که بخواهد از این کلاس استفاده کند باید یک شیء از نوع  ICustomerDataAccess را به آن تزریق کند.

ماننده مثال زیر:

در کد فوق، کلاس CustomerService یک شیء از کلاس CustomerDataAccess را ایجاد و به کلاس CustomerBusinessLogic تزریق می کند. بنابراین دیگر نیازی به ایجاد یک شیء از CustomerBusinessLogic در داخل کلاس CustomerDataAccess نیست.

تزریق پراپرتی (Property Injection)

در این نوع تزریق، کلاس Injector سرویس (dependency) را از طریق پراپرتی عمومی کلاس کلاینت تزریق می کند.

در مثال زیر الگوی تزریق وابستگی با استفاده از Property پیاده سازی شده است:

در کد بالا، کلاس CustomerBusinessLogic شامل یک پراپرتی عمومی به نام DataAccess است که برای تنظیم یک شیء پیاده سازی شده بر اساس ICustomerDataAccess استفاده می شود. بنابراین کلاس CustomerService با استفاده از این پراپرتی شیء از نوع CustomerDataAccess را به کلاس CustomerBusinessLogic تزریق می کند.

تزریق متد (Method Injection)

در این نوع تزریق، کلاس کلاینت برای مشخص کردن وابستگی ها یک interface پیاده سازی می کند و کلاس تزریق کننده با استفاده از این interface وابستگی های کلاس کلاینت را تزریق می کند.

در مثال زیر الگوی تزریق وابستگی با استفاده از Method پیاده سازی شده است:

در مثال فوق، کلاس CustomerBusinessLogic رابط IDataAccessDependency را که شامل متد SetDependency است را پیاده سازی کرده است. بنابراین کلاس CustomerService (تزریق کننده)  می تواند با استفاده از متد SetDependency کلاس CustomerDataAccess را به کلاس مشتری تزریق کند.

مطالب مرتبط
تفاوت WPF با Windows Forms چیست
ثبت نظر
ریفریش کنید!
نظرات کاربران (۰ مورد)

هیچ نظری ثبت نشده است