الگوی تزئین کننده (Decorator Pattern) با تزریق وابستگی (Dependency Injection)

الگوی تزئین کننده (Decorator Pattern) با تزریق وابستگی (Dependency Injection)

الگوی تزئین کننده چیست؟

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

برای جستجوی بیشتر در مورد این الگو، توصیه می کنم به کتاب Gang of Four مراجعه کنید. تمرکز اصلی من در خبرنامه امروز، نشان دادن نحوه نمایش عملکرد آن از طریق تزریق وابستگی است.

کاربردهای الگوی تزئین کننده

ما می توانیم از الگوی تزئین کننده زمانی استفاده کنیم که بخواهیم رفتار جدیدی را به کد پایه موجود معرفی کنیم، برای مثال:

  • ثبت اطلاعات اضافی (Extra Logging)
  • افزایش مقاومت (Build Resiliency)

و می خواهیم آن را روی تمام نمونه ها اعمال کنیم.

تزریق وابستگی (Dependency Injection) چیست؟

تزریق وابستگی شامل ارائه وابستگی های مورد نیاز یک کلاس از یک منبع خارجی به جای اینکه خود کلاس آنها را ایجاد کند، است. این کار به جداسازی فرآیند ایجاد شی از فراخواننده کمک می کند و منجر به سیستمی ماژولارتر و انعطاف پذیرتر می شود.

به عبارت دیگر، به یک کلاس اجازه می دهد تا روی عملکرد اصلی خود تمرکز کند تا نگرانی در مورد چگونگی ایجاد و مدیریت وابستگی های خود داشته باشد.

پیاده سازی تزریق وابستگی در .NET

✅ در .NET 6 و بالاتر می توانیم DI را در کلاس Program.cs با استفاده از builder.Services پیاده سازی کنیم.

✅ برای نسخه های قبلی .NET، برای پیاده سازی DI، باید سرویس را در متد “ConfigureServices” که در فایل Startup.cs قرار دارد، اضافه کنیم.

چگونه DI با الگوی تزئین کننده مطابقت دارد؟

به تازگی در حال کار روی یک پروژه unit test بودم که یکی از کلاس های من یک OptionsModel را می گرفت اما از IOptions/IConfiguration نبود.

به طور مثال در اینجا می توانیم بگوییم که نام کلاس StudentService بود و IStudentService را پیاده سازی می کرد. بنابراین اولین چیزی که به ذهن می رسد در مورد ثبت وابستگی آن با افزودن این خط ساده بود:

اما این می توانست باعث ایجاد مشکل شود زیرا کلاس یک مدل را می گرفت، بنابراین من در اینجا از الگوی تزئین کننده به این روش استفاده کردم:

به این ترتیب ما با موفقیت مشکل وابستگی را حل کردیم.

آیا این یک راه حل درست است ؟

پاسخ خیر است، زمانی که پارامترهایمان تغییر کند، باید نمونه این کلاس را به روز کنیم، اما تا آن زمان اشکالی ندارد.