تزریق وابستگی یا Dependency Injection (به اختصار DI) یک الگوی طراحی قدرتمند در برنامهنویسی شیگرا است. این الگوی طراحی با استفاده از یک رابط (Interface)، وابستگیهای بین دو کلاس را حذف یا آنها را به حداقل میرساند. تزریق وابستگی مزایای زیادی به دنبال دارد که از جمله آنها میتوان به بهبود قابلیت تستپذیری، نگهداری و انعطافپذیری کدها اشاره کرد. حذف وابستگی بین کلاسها به توسعهدهندگان این امکان را میدهد تا فرایند آزمایش و توسعه را با سرعت بالایی انجام دهند. در این نوشته قصد داریم آموزش dependency Injection سی شارپ را با استفاده از مثالهای عملی بررسی کنیم تا با مزایای آن به طور کامل آشنا شوید.
تزریق وابستگی چیست؟
اپلیکیشنهای طراحی شده با استفاده از سی شارپ و سایر زبانهای برنامهنویسی معمولا توسط یک تیم توسعه پیدا میکنند. همچنین این اپلیکیشنها در طول زمان آپدیت شده و امکانات آنها بیشتر میشود؛ به همین دلیل یکی از دغدغههای مهم توسعهدهندگان، پیادهسازی یک نرم افزار با ساختار استاندارد است تا انعطافپذیری بیشتری در توسعه داشته باشد. یکی از اصولی که برای طراحی نرم افزارها با C# به کار برده میشود تزریق وابستگی است. زمانی که شما مفهوم dependency را درک و آن را در کدنویسی پیاده کنید، با انعطاف بیشتری میتوانید اپلیکیشنها را توسعه دهید.
در یک تعریف ساده میتوان گفت، الگوی طراحی دیپندنسی اینجکشن به اجزای یک سیستم این امکان را میدهد تا وابستگیهای خود را از یک منبع خارجی دریافت کنند؛ نه اینکه خودشان آنها را ایجاد کنند. به عبارت دیگر، به جای اینکه وابستگیهای مورد نیاز یک کلاس به طور مستقیم در داخل آن ایجاد شود، از بیرون به آن تزریق میشود. این مساله باعث میشود کدها ماژولارتر و قابل نگهداری باشند.
در آموزش dependency injection سی شارپ با دو اصلاح سروکار داریم که عبارتند از:
- Tight coupled: بیشترین وابستگی بین دو کلاس
- Loosely coupled: کمترین وابستگی بین دو کلاس
الگوی طراحی تزریق وابستگی از سه کلاس به شکل زیر تشکیل شده است:
- Client Class: کلاینت کلاس یک کلاس وابسته به کلاس سرویس است.
- Service Class: این کلاس برخی خدمات را در اختیار کلاس کلاینت قرار میدهد.
- Injector Class: این کلاس شی ایجاد شده از کلاس سرویس را به کلاس کلاینت تزریق میکند.
در الگوی بالا، یک شکل ساده از الگوی طراحی DI را آوردهایم. در این الگو کلاس اینجکتور یک شی از کلاس سرویس را در خارج از کلاس ایجاد کرده و آن را به کلاس کلاینت تزریق میکند.
آموزش dependency injection سی شارپ چه مزایایی دارد؟
استفاده از این مفهوم در C# مزایای زیادی دارد که برخی از آنها عبارتند از:
- کاهش وابستگیها: دیپندنسی اینجکشن وابستگی مستقیم بین کلاسها را حذف میکند. به این صورت که همه کلاسها، وابستگیهای خود را از یک رابط (اینترفیسها یا کلاسهای abstract) دریافت میکنند.
- بهبود تستپذیری: با استفاده از تزریق وابستگی به راحتی میتوانید هر شی را به صورت مجزا آزمایش کرده و پیچیدگی تستها را به حداقل برسانید.
- قابلیت استفاده مجدد: این قابلیت در سی شارپ کمک میکند تا کدها قابلیت استفاده مجدد داشته باشند؛ این مساله به ماژولار بودن کد کمک کرده و نگهداری کدها را آسان میکند.
پیشنهاد مطالعه: آموزش TreeView در سی شارپ به زبان ساده
انواع تزریق وابستگی در سی شارپ
کلاس Injector در سی شارپ به طور کلی با سه روش وابستگی را تزریق میکند که در ادامه به توضیح آنها خواهیم پرداخت.
۱. تزریق از طریق تابع سازنده (Constructor Injection)
یکی از رایجترین روشها برای تزریق وابستگی در سی شارپ، تزریق از طریق متد سازنده است. در این روش همه وابستگیها از طریق سازنده کلاس ارائه میشود؛ درست مانند مثال زیر:
public class CustomerService { private readonly ICustomerRepository _customerRepository; public CustomerService(ICustomerRepository customerRepository) { _customerRepository = customerRepository; } // ... }
در کد بالا کلاس CustomerService به یک رابط یعنی ICustomerRepository وابسته است. در این کد وابستگی را از طریق متد سازنده کلاس تزریق کردیم و هنگام ایجاد کلاس، وابستگیهای لازم نیز ایجاد میشوند.
۲. تزریق از طریق پراپرتی (Property Injection)
روش دیگری که در آموزش تزریق وابستگی در سی شارپ میتوانید انجام دهید، تزریق از طریق پراپرتی است. با این که این روش انعطافپذیر است؛ اما به طور کامل نشان نمیدهد یک کلاس چه وابستگیهایی دارد.
public class CustomerService { public ICustomerRepository CustomerRepository { get; set; } // ... }
۳. تزریق از طریق متد (Method Injection)
روش دیگری که در آموزش dependency injection سی شارپ به معرفی آن میپردازیم، تزریق از طریق متد است. در این روش به جای سازنده یا پراپرتی از یک متد استفاده میکنیم. method injection زمانی مفید است که یک متد به یک وابستگی خاص نیاز داشته باشد.
public class CustomerService { // ... public void SetCustomerRepository(ICustomerRepository customerRepository) { _customerRepository = customerRepository; } // ... }
آموزش ioc در سی شارپ
تزریق وابستگی به صورت دستی در سی شارپ و Asp net core میتواند برای برنامههای کوچک مناسب باشد؛ اما اگر مقیاس برنامه افزایش پیدا کند، روش دستی موثر نخواهد بود و امکان دارد با مشکلات زیادی مواجه شوید. در این شرایط بهترین انتخاب استفاده از Ioc container خواهد بود.
یک فریمورک برای پیادهسازی خودکار وابستگیها در برنامه نویسی است. این فریمورک وابستگیها را از طریق متد، پراپرتی یا کلاس سازنده و در زمان مناسب تزریق میکند. با این کار دیگر مجبور نیستیم به صورت دستی وابستگیها را تزریق کنیم.
// Startup.cs public void ConfigureServices(IServiceCollection services) { services.AddScoped<ICustomerRepository, CustomerRepository>(); services.AddScoped(); }
در مثال بالا ما اینترفیسها و پیادهسازی آنها را از طریق DI container ثبت کردیم تا همه وابستگیها را تزریق کرده و فرایند کدنویسی را ساده کند.
پیشنهاد مطالعه: معرفی ۱۰ کتاب آموزش سی شارپ برتر
جمعبندی
تزریق وابستگی یک تکنیک بسیار قدرتمند در برنامه نویسی شی گرا است که به توسعه دهندگان کمک میکند تا فرایند توسعه و نگهداری برنامه را به آسانی انجام دهند. با انجام کارهایی که در بالا گفتیم و تزریق وابستگی به کدها میتوانید کدهای ماژولار بنویسید که قابلیت استفاده مجدد را دارند. در آموزش dependency injection سی شارپ سعی کردیم نکات مهم و اصلی در رابطه با دیپندنسی اینجکشن را با شما عزیزان به اشتراک بگذاریم.
در صورتی که قصد دارید برنامه نویسی سی شارپ را به صورت اصولی یاد بگیرید، توصیه میکنیم حتما در دورههای آموزش سی شارپ مکتب خونه شرکت کنید. این دورهها توسط اساتید حرفهای ضبط شده و مفاهیم اصلی همچون تزریق وابستگی را به طور کامل و با ارائه مثالهای عملی توضیح دادهاند. در پایان دوره و بعد از دریافت مدرک نیز میتوانید وارد بازار کار شده و به کسب درآمد بپردازید.
منبع