دسته بندی مقالات
- بیشتر -محصولات
- بیشتر -آخرین مقالات
- بیشتر --
view در پایگاه داده SQL
1403/12/20 -
پیاده سازی Synchronization در سی شارپ
1403/12/20 -
Fragmentation در پایگاه داده SQL
1403/12/19 -
Delegate در سی شارپ
1403/12/19 -
B-Trees در پایگاه داده SQL
1403/12/18 -
Thread ها در سی شارپ
1403/12/18
Inversion of Control و Dependency Injection در سی شارپ

آشنایی با مفاهیم Inversion of Control و Dependency Injection در سی شارپ
در دنیای توسعه نرمافزار، نوشتن کدی که قابل نگهداری، توسعهپذیر و تستپذیر باشد اهمیت زیادی دارد.
برای رسیدن به این اهداف، مفاهیمی مانند Inversion of Control (IoC) و Dependency Injection (DI) مطرح شدهاند که در برنامهنویسی شیگرا، به ویژه در سیشارپ، کاربرد فراوانی دارند.
این مفاهیم به ما کمک میکنند تا وابستگیهای بین کلاسها را کاهش دهیم و سیستمهایی ماژولار و منعطف طراحی کنیم.
Inversion of Control و Dependency Injection دو مفهوم کلیدی در برنامهنویسی شیگرا هستند که نقش مهمی در افزایش قابلیت تست، توسعهپذیری و انعطافپذیری کد دارند.
با استفاده از DI و IoC Containers میتوان وابستگیهای بین کلاسها را کاهش داد و برنامهای ماژولار و مقیاسپذیر طراحی کرد.
در سیشارپ، ابزارهای مختلفی مانند Microsoft.Extensions.DependencyInjection به ما کمک میکنند تا این اصول را به راحتی در پروژههای خود پیادهسازی کنیم.
استفاده صحیح از این مفاهیم نهتنها باعث بهبود عملکرد نرمافزار میشود، بلکه هزینههای نگهداری و توسعه را نیز کاهش میدهد.
بنابراین، توصیه میشود که در طراحی پروژههای خود، همواره از IoC و DI بهره ببرید تا برنامهای قابل مدیریت، تستپذیر و انعطافپذیر داشته باشید.
آیا به دنبال یک فرصت عالی برای یادگیری برنامهنویسی هستید؟ 🚀
با دوره آموزشی سیشارپ ما، شما میتوانید مهارتهای خود را به سطح جدیدی ارتقا دهید! این دوره بهطور کامل طراحی شده تا به شما کمک کند تا از مبتدی تا پیشرفته در دنیای برنامهنویسی سیشارپ پیش بروید.
👨🏫 چرا دوره ما را انتخاب کنید؟
- محتوای جامع و عملی: با پروژههای واقعی و تمرینات عملی، یادگیری را به تجربهای جذاب تبدیل کنید.
- مدرس مجرب: از تجربه و دانش مدرس حرفهای بهرهمند شوید که شما را در هر مرحله از یادگیری راهنمایی میکنند.
- پشتیبانی ۲۴/۷: هر زمان که سوالی داشتید، ما در کنار شما خواهیم بود تا به شما کمک کنیم.
- دسترسی مادامالعمر: به محتوای دوره دسترسی دائمی داشته باشید و هر زمان که خواستید، میتوانید به آن مراجعه کنید.
💡 فرصت را از دست ندهید!
بایادگیری سیشارپ، میتوانید در دنیای فناوری اطلاعات به یک متخصص تبدیل شوید و در پروژههای جذاب و چالشبرانگیز شرکت کنید.
همین امروز به جمع یادگیرندگان ما بپیوندید و اولین قدم را به سوی آیندهای روشنتر بردارید!
شرکت در دوره آموزش برنامه نویسی سی شارپ
Inversion of Control چیست؟
Inversion of Control یا معکوسسازی کنترل یک اصل در طراحی نرمافزار است که کنترل ایجاد و مدیریت وابستگیها را از کلاسها به یک بخش خارجی منتقل میکند.
به عبارت دیگر، به جای اینکه یک کلاس خودش مسئول ایجاد و مدیریت اشیای وابسته به خود باشد، این وظیفه به یک Container یا Dependency Injector سپرده میشود.
IoC باعث جداسازی مسئولیتها در برنامه میشود و وابستگیهای سختکدشده (Hard-Coded Dependencies) را کاهش میدهد.
این کار باعث افزایش انعطافپذیری، بهبود قابلیت تست و تسهیل نگهداری کد میشود.
چرا به Inversion of Control نیاز داریم؟
در برنامهنویسی شیگرا، کلاسها معمولاً برای انجام وظایف مختلف به یکدیگر وابستهاند.
اگر این وابستگیها مستقیماً در کلاسها تعریف شوند، مشکلاتی مانند کاهش قابلیت تست، سختشدن تغییرات و افزایش پیچیدگی کد ایجاد میشود.
برای درک بهتر این موضوع، کد زیر را در نظر بگیرید:
public class EmailService
{
public void SendEmail(string message)
{
Console.WriteLine("Sending Email: " + message);
}
}
public class NotificationService
{
private EmailService _emailService;
public NotificationService()
{
_emailService = new EmailService();
}
public void Notify(string message)
{
_emailService.SendEmail(message);
}
}
در این مثال، کلاس NotificationService به طور مستقیم EmailService را ایجاد کرده است. این کار باعث میشود که:
-
اگر بخواهیم روش ارسال پیام را تغییر دهیم (مثلاً پیامک اضافه کنیم)، باید مستقیماً کلاس را ویرایش کنیم.
-
امکان تست واحد (Unit Testing) دشوار میشود، زیرا برای تست NotificationService حتماً باید EmailService هم اجرا شود.
-
قابلیت توسعه و نگهداری کد کاهش پیدا میکند، زیرا هر تغییری در EmailService نیازمند تغییر در NotificationService خواهد بود.
-
برای حل این مشکل، از IoC و DI استفاده میکنیم تا وابستگیها را کاهش دهیم.
Dependency Injection چیست؟
Dependency Injection یا تزریق وابستگی یکی از روشهای پیادهسازی IoC است.
در این روش، به جای اینکه یک کلاس خودش وابستگیهایش را ایجاد کند، این وابستگیها از بیرون به آن تزریق میشوند.
این کار باعث افزایش انعطافپذیری و کاهش وابستگیهای مستقیم بین کلاسها میشود.
در DI، وابستگیها را میتوان به روشهای مختلفی تزریق کرد:
-
تزریق سازنده (Constructor Injection)
-
تزریق متد (Method Injection)
-
تزریق خاصیت (Property Injection)
-
پیادهسازی Dependency Injection در سیشارپ
حال بیایید مثال قبل را با استفاده از DI بازنویسی کنیم:
public interface IEmailService
{
void SendEmail(string message);
}
public class EmailService : IEmailService
{
public void SendEmail(string message)
{
Console.WriteLine("Sending Email: " + message);
}
}
public class NotificationService
{
private readonly IEmailService _emailService;
public NotificationService(IEmailService emailService)
{
_emailService = emailService;
}
public void Notify(string message)
{
_emailService.SendEmail(message);
}
}
در این روش، وابستگی IEmailService از طریق سازنده (Constructor Injection) به کلاس NotificationService تزریق شده است.
حال میتوان در برنامه به سادگی از این کلاس استفاده کرد:
IEmailService emailService = new EmailService();
NotificationService notificationService = new NotificationService(emailService);
notificationService.Notify("Hello Dependency Injection!");
مزایای استفاده از Dependency Injection و Inversion of Control
-
افزایش قابلیت تستپذیری
با جدا کردن وابستگیها، میتوان از Mocking برای تست کلاسها استفاده کرد. -
کاهش وابستگیها
تغییرات در یک کلاس، تأثیری روی دیگر کلاسها نخواهد داشت. -
افزایش توسعهپذیری
به راحتی میتوان کلاسهای جدیدی را جایگزین کرد یا قابلیتهای جدیدی اضافه کرد. -
بهبود خوانایی و مدیریت کد
ساختار پروژه بهبود پیدا کرده و مدیریت وابستگیها آسانتر میشود.
استفاده از Inversion of Control Container در سی شارپ
برای مدیریت بهتر وابستگیها، میتوان از IoC Containers مانند Microsoft.Extensions.DependencyInjection، Autofac، Unity یا Ninject استفاده کرد.
این ابزارها به ما کمک میکنند تا وابستگیها را بهصورت خودکار مقداردهی و مدیریت کنیم.
مثال زیر نحوه استفاده از Microsoft.Extensions.DependencyInjection را نشان میدهد:
using Microsoft.Extensions.DependencyInjection;
var serviceProvider = new ServiceCollection()
.AddScoped<IEmailService, EmailService>()
.AddScoped<NotificationService>()
.BuildServiceProvider();
var notificationService = serviceProvider.GetService<NotificationService>();
notificationService.Notify("Using IoC Container!");
مثال پروژه محور از IoC و DI در سی شارپ
پیادهسازی IoC و DI در یک سیستم اطلاعرسانی (Notification System) در سیشارپ
هدف پروژه:
یک سیستم اطلاعرسانی طراحی میکنیم که از طریق ایمیل و پیامک (SMS) به کاربران پیام ارسال کند.
وابستگیها را با استفاده از Dependency Injection (DI) مدیریت میکنیم و از IoC Container برای مقداردهی خودکار استفاده خواهیم کرد.
-
تعریف اینترفیس سرویس اطلاعرسانی
ابتدا یک اینترفیس برای سرویسهای ارسال پیام تعریف میکنیم:
public interface IMessageService
{
void SendMessage(string recipient, string message);
}
-
پیادهسازی کلاسهای ارسال پیام
-
سرویس ارسال ایمیل
-
public class EmailService : IMessageService
{
public void SendMessage(string recipient, string message)
{
Console.WriteLine($"Sending Email to {recipient}: {message}");
}
}
-
-
سرویس ارسال پیامک (SMS)
-
public class SmsService : IMessageService
{
public void SendMessage(string recipient, string message)
{
Console.WriteLine($"Sending SMS to {recipient}: {message}");
}
}
-
-
ایجاد کلاس مدیریت اطلاعرسانی با تزریق وابستگی
این کلاس، نوع سرویس را دریافت کرده و پیام را ارسال میکند.
-
public class NotificationService
{
private readonly IMessageService _messageService;
public NotificationService(IMessageService messageService)
{
_messageService = messageService;
}
public void Notify(string recipient, string message)
{
_messageService.SendMessage(recipient, message);
}
}
-
-
پیادهسازی IoC Container با استفاده از Dependency Injection
در این مرحله، از Microsoft.Extensions.DependencyInjection برای مدیریت وابستگیها استفاده میکنیم.
-
using Microsoft.Extensions.DependencyInjection;
var serviceProvider = new ServiceCollection()
.AddScoped<IMessageService, EmailService>() // میتوانیم اینجا SmsService را جایگزین کنیم
.AddScoped<NotificationService>()
.BuildServiceProvider();
var notificationService = serviceProvider.GetService<NotificationService>();
notificationService.Notify("user@example.com", "Hello, Dependency Injection in C#!");
-
-
تغییر نوع سرویس بدون تغییر در کلاسهای اصلی
برای تغییر روش ارسال پیام (مثلاً از ایمیل به پیامک)، فقط کافی است یک خط در IoC Container تغییر کند:
-
var serviceProvider = new ServiceCollection()
.AddScoped<IMessageService, SmsService>() // تغییر از EmailService به SmsService
.AddScoped<NotificationService>()
.BuildServiceProvider();
با استفاده از Inversion of Control (IoC) و Dependency Injection (DI) در این پروژه:
-
وابستگیها به صورت پویا مدیریت میشوند.
-
تغییرات در روش ارسال پیام بدون نیاز به تغییر در سایر کلاسها انجام میشود.
-
قابلیت تست واحد (Unit Testing) بهبود مییابد.
-
کد خواناتر، ماژولارتر و توسعهپذیرتر میشود.
این روش در پروژههای واقعی مانند توسعه APIها، سیستمهای پیامرسان و معماریهای لایهای بسیار کاربردی است.
دوره های مرتبط

آموزش برنامه نویسی سی شارپ
زبان شی گرایی حرفه ای سی شارپ یک زبان قدرتمند برای طراحی نرم افزار به شمار میرود.