تزریق وابستگی در asp.net core | بررسی اصول و بهترین روش‌ها

تزریق وابستگی در asp.net core | بررسی اصول و بهترین روش‌ها

نوشته شده توسط: تیم فنی نیک آموز
تاریخ انتشار: ۱۲ اسفند ۱۴۰۳
آخرین بروزرسانی: 12 اسفند 1403
زمان مطالعه: 15 دقیقه
۰
(۰)

در دنیای توسعه نرم‌افزار، مدیریت وابستگی‌ها یکی از چالش‌های اساسی است که تأثیر مستقیم بر قابلیت نگهداری، تست‌پذیری و توسعه‌پذیری برنامه‌ها دارد. در ASP.NET Core، الگوی تزریق وابستگی (Dependency Injection) به‌عنوان راه‌حلی کارآمد برای این مسئله معرفی شده است؛ این الگو با جداسازی وابستگی‌ها و تزریق آن‌ها به اجزای مختلف، به توسعه‌دهندگان امکان می‌دهد تا کدهایی ماژولار، قابل تست و با پیوستگی کمتر بنویسند.

استفاده از تزریق وابستگی در ASP.NET Core  نه ‌تنها به بهبود ساختار و سازمان‌دهی کد کمک می‌کند، بلکه با فراهم‌کردن یک کانتینر IoC (Inversion of Control) داخلی، فرآیند مدیریت طول عمر و وابستگی سرویس‌ها را ساده‌تر می‌سازد؛ این قابلیت به توسعه‌دهندگان اجازه می‌دهد تا بدون نیاز به کتابخانه‌های خارجی، وابستگی‌های خود را به‌صورت مؤثر مدیریت کنند.

در این مقاله، با نگاهی عمیق به مفاهیم پیشرفته تزریق وابستگی در ASP.NET Core، به بررسی نحوه پیاده‌سازی، مدیریت طول عمر سرویس‌ها و الگوهای طراحی مرتبط خواهیم پرداخت؛ همچنین، با ارائه مثال‌های عملی، کاربردهای این الگو در بهبود ساختار و عملکرد برنامه‌های ASP.NET Core  را مورد بحث قرار می‌دهیم.

پس اگر به دنبال تسلط بر DI در ASP.NET Core هستید، تا انتهای این مقاله همراه باشید، چرا که قرار است مفاهیمی را بررسی کنیم که کمتر در منابع آموزشی دیگر پوشش داده شده‌اند.

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

تزریق وابستگی (Dependency Injection) در asp.net core یک الگوی طراحی است که در آن وابستگی‌های یک کلاس از طریق سازنده (Constructor Injection)، متد (Method Injection) یا ویژگی‌ها (Property Injection) به آن کلاس تزریق می‌شوند؛ این روش باعث می‌شود کلاس‌ها از وابستگی‌های خود مستقل باشند و امکان تست‌پذیری و نگهداری آن‌ها افزایش یابد.

در ASP.NET Core، فریمورک به‌ صورت داخلی از تزریق وابستگی پشتیبانی می‌کند و یکContainer IoC  داخلی برای مدیریت سرویس‌ها فراهم شده است. این ویژگی به توسعه‌دهندگان امکان می‌دهد که بدون نیاز به کتابخانه‌های شخص ثالث مانند Autofac  یا Ninject، وابستگی‌های خود را ثبت و مدیریت کنند.

 

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

 

مزایای استفاده از تزریق وابستگی در ASP.NET Core

تزریق وابستگی (DI) یکی از اصول کلیدی در معماری ASP.NET Core  است که مدیریت وابستگی‌ها را بهبود می‌بخشد. این تکنیک باعث افزایش انعطاف‌پذیری، قابلیت تست ‌پذیری و مدیریت بهینه وابستگی‌ها در برنامه می‌شود؛ در ادامه به بررسی مزایای استفاده از Dependency Injection  درASP.NET Core  می‌پردازیم:

  • بهبود ماژولار بودن کد: با استفاده از تزریق وابستگی، کلاس‌ها به‌صورت جداگانه و مستقل از یکدیگر عمل می‌کنند.
  • افزایش تست‌پذیری: با حذف وابستگی‌های سخت‌کد شده، می‌توان Mock‌ها را جایگزین کرد و تست‌های واحد موثرتری نوشت.
  • مدیریت آسان وابستگی‌ها:NET Core یک Service Container  داخلی دارد که طول عمر سرویس‌ها را مدیریت می‌کند.
  • افزایش خوانایی و نگهداری کد: وابستگی‌ها از داخل کلاس‌ها حذف شده و در سطح بالاتری مدیریت می‌شوند.

انواع وابستگی‌ها در ASP.NET Core و نحوه مدیریت آن‌ها

در ASP.NET Core، وابستگی‌ها به روش‌های مختلفی مدیریت می‌شوند که هرکدام تأثیر مستقیمی بر عملکرد، نگهداری و تست‌پذیری کد دارند. در این بخش، به معرفی انواع وابستگی‌ها و نحوه مدیریت صحیح آن‌ها می‌پردازیم:

۱. وابستگی‌های لحظه‌ای  (Transient)

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

نحوه ثبت در IoC Container

services.AddTransient<IExampleService, ExampleService>();

 

از کاربرد‌های وابستگی لحظه‌ای می‌توان به سرویس‌های ساده و Stateless و پردازش‌های کوتاه‌مدت که نیازی به نگهداری داده ندارند، اشاره کرد.

 

۲. وابستگی‌های ناحیه‌ای (Scoped)

این نوع وابستگی‌ها در طول یک درخواست HTTP یک نمونه ثابت از کلاس را در اختیار قرار می‌دهند؛ یعنی تا زمانی که درخواست کاربر در حال اجراست، از همان نمونه استفاده می‌شود.

نحوه ثبت در IoC Container

services.AddScoped<IUserRepository, UserRepository>();

 

سرویس‌هایی که در یک درخواست به داده‌های مشترک نیاز دارند (مانند Repository) و جلوگیری از ایجاد نمونه‌های زیاد در یک درخواست واحد از کاربرد‌های این وابستگی هستند.

 

۳. وابستگی‌های سراسری (Singleton)

در این مدل، تنها یک نمونه از کلاس در طول اجرای برنامه ایجاد شده و همان نمونه به تمام بخش‌های برنامه تزریق می‌شود.

نحوه ثبت در IoC Container

services.AddSingleton<ILogger, ConsoleLogger>();

 

از کاربردهای این وابستگی می‌توان به سرویس‌هایی که باید در طول عمر برنامه یک نمونه ثابت داشته باشند، مدیریت حافظه Cache و سرویس‌های ارتباطی مانند Logging و Configuration Managementاشاره کرد.

نکته مهم: استفاده از Singleton در محیط‌های چندنخی (Multithreaded) باید با دقت انجام شود. در صورت نیاز، پیاده‌سازی Singleton باید Thread-Safe  باشد تا از مشکلات هم‌زمانی جلوگیری شود. یکی از روش‌های رایج برای اطمینان از ایمنی در برابر هم‌زمانی، استفاده از Lazy Initialization  یا Lock Mechanisms  است.

 

depenfency injection

 

علاوه بر این، Singleton ها معمولاً برای مدیریت تنظیمات، کش (Cache)، و سرویس‌های مشترک مانند لاگ‌گیری استفاده می‌شوند. اما باید مراقب حافظه مصرفی بالا و پیچیدگی مدیریت وضعیت داخلی آن‌ها باشید. درصورتی‌که Singleton  شما نیاز به تغییر وضعیت دارد، بهتر است از Immutable Objects  یا Synchronization  Mechanisms برای جلوگیری از شرایط رقابتی (Race Conditions) استفاده کنید.

نحوه پیاده‌سازی تزریق وابستگی در ASP.NET Core

در ASP.NET Core، تزریق وابستگی به‌صورت پیش‌فرض پشتیبانی می‌شود و می‌توان وابستگی‌ها را درContainer  ثبت و مدیریت کرد. برای این کار، کلاس‌ها و اینترفیس‌های مربوطه تعریف می‌شوند و سپس درProgram.cs  یا Startup.cs  مقداردهی می‌شوند. با این روش، وابستگی‌ها هنگام اجرای برنامه به کلاس‌های مورد نیاز تزریق می‌شوند.

ثبت سرویس‌ها در کانتینر IoC

در ASP.NET Core، تمام وابستگی‌ها باید در **متد **ConfigureServices در Startup.cs  یا Program.cs   ثبت شوند. این کار با استفاده از **متدهای AddSingleton، AddScoped  و **AddTransient انجام می‌شود.

public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<IExampleService, ExampleService>();
services.AddScoped<IUserRepository, UserRepository>();
services.AddSingleton<ILogger, ConsoleLogger>();
}

 

پیاده‌سازی عملی تزریق وابستگی در ASP.NET Core

برای پیاده‌سازی تزریق وابستگی، ابتدا باید یک اینترفیس و کلاس پیاده‌سازی آن را تعریف کنیم. سپس این وابستگی را درContainer  ثبت کرده و در کلاس‌های مورد نیاز تزریق کنیم. این کار باعث مدیریت بهتر وابستگی‌ها و افزایش انعطاف‌پذیری کد می‌شود.

تعریف اینترفیس و پیاده‌سازی آن

public interface IMessageService
{
    void SendMessage(string message);
}
public class EmailService : IMessageService
{
    public void SendMessage(string message)
    {
        Console.WriteLine($"Email Sent: {message}");
    }
}

 

ثبت سرویس در IoC Container

public void ConfigureServices(IServiceCollection services)
{
    services.AddTransient<IMessageService, EmailService>();
}

 

استفاده از تزریق وابستگی در یک کنترلر

public class HomeController : Controller
{
    private readonly IMessageService _messageService;
    public HomeController(IMessageService messageService);
    {
        _messageService = messageService;
    }
    public IActionResult Index()
    {
        _messageService.SendMessage("Hello, Dependency Injection!");
        return View();
    }
}

 

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

در ASP.NET Core، علاوه بر روش‌های پایه تزریق وابستگی، می‌توان از الگوهای پیشرفته مانند Factory Pattern و Injection via Middleware  استفاده کرد. این الگوها به مدیریت بهتر وابستگی‌ها، افزایش انعطاف‌پذیری و بهینه‌سازی عملکرد در پروژه‌های بزرگ کمک می‌کنند

تزریق وابستگی در Middleware

public class CustomMiddleware
{
    private readonly RequestDelegate _next;
    private readonly IMessageService _messageService;  
    public CustomMiddleware(RequestDelegate next, IMessageService messageService)
    {
        _next = next;
        _messageService = messageService;
    }
    public async Task Invoke(HttpContext context)
    {
        _messageService.SendMessage("Middleware executed!");
        await _next(context);
    }
}

 

استفاده از Factory برای کنترل ساخت وابستگی‌ها

services.AddTransient<IMessageService>(provider =>
    new EmailService());

 

جلوگیری از Circular Dependency

یکی از مشکلات رایج در استفاده از DI، Circular Dependency است، یعنی مانی که دو یا چند سرویس به یکدیگر وابسته باشند و این وابستگی باعث حلقه بی‌پایان شود. این مشکل می‌تواند باعث شکست اجرای برنامه و افزایش پیچیدگی دیباگینگ شود. در ادامه شما را با مهمترین راهکار‌های جلوگیری از Circular Dependency می‌پردازیم.

DI در asp.net core

 

راهکارهای جلوگیری از Circular Dependency:

  • استفاده از Factory Pattern: به‌جای تزریق مستقیم وابستگی‌ها، می‌توان از یک Factory برای ایجاد نمونه‌های موردنیاز استفاده کرد و از وابستگی مستقیم بین کلاس‌ها اجتناب کرد.
  • استفاده از Mediator Pattern: به‌جای وابستگی مستقیم بین کلاس‌ها، می‌توان از یک واسط مرکزی (Mediator) استفاده کرد که ارتباط بین کلاس‌ها را مدیریت کند.
  • تفکیک وظایف (Separation of Concerns): بازبینی معماری و جداسازی بخش‌های مختلف می‌تواند وابستگی‌های غیرضروری را کاهش دهد و از ایجاد حلقه‌های وابستگی جلوگیری کند.
  • استفاده از Lazy Loading: در برخی موارد می‌توان وابستگی‌ها را تنها در زمانی که واقعاً موردنیاز هستند، مقداردهی کرد تا از وابستگی‌های دایره‌ای جلوگیری شود.
  • عدم تزریق مستقیم کلاس‌ها: به‌جای تزریق مستقیم کلاس‌های وابسته، از اینترفیس‌ها استفاده کنید تا انعطاف‌پذیری بیشتری داشته باشید.

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

تزریق وابستگی (Dependency Injection) یکی از اصول کلیدی درASP.NET Core  است که مزایای متعددی را برای توسعه‌دهندگان به همراه دارد. برخی از مهم‌ترین دلایل استفاده از این الگو عبارتند از:

  1. کاهش وابستگی‌های سخت‌کد شده
    بدون استفاده از تزریق وابستگی، کلاس‌ها معمولاً به طور مستقیم وابسته به پیاده‌سازی‌های خاص خود هستند. این موضوع باعث افزایش پیچیدگی و کاهش انعطاف‌پذیری کد می‌شود؛ تزریق وابستگی به ما این امکان را می‌دهد که وابستگی‌ها را به صورت پویا و قابل تغییر مدیریت کنیم.
  2. افزایش تست‌پذیری (Testability)
    با استفاده از تزریق وابستگی، کلاس‌ها به جای وابستگی به پیاده‌سازی‌های واقعی، از اینترفیس‌ها و Mock‌ها استفاده می‌کنند. این روش باعث می‌شود که نوشتن تست‌های واحد (Unit Tests) ساده‌تر شده و وابستگی‌ها به منابع خارجی کاهش پیدا کند.
  3. کاهش پیچیدگی کد و افزایش خوانایی
    زمانی که وابستگی‌ها از طریق IoC Container مدیریت می‌شوند، کلاس‌ها فقط روی وظایف خود تمرکز می‌کنند و از مدیریت وابستگی‌ها بی‌نیاز هستند. این موضوع به بهبود ساختار کد و خوانایی آن کمک می‌کند.
  4. مدیریت بهتر طول عمر سرویس‌ها
    در NET Core می‌توان وابستگی‌ها را با استفاده از AddTransient، AddScoped  و AddSingleton  ثبت کرد و طول عمر آن‌ها را متناسب با نیاز پروژه مدیریت کرد. این ویژگی از ایجاد مشکلاتی مانند نشتی حافظه (Memory Leak) جلوگیری می‌کند.
  5. انعطاف‌پذیری بیشتر و سهولت تغییرات
    فرض کنید نیاز دارید که یک سرویس ایمیل‌رسانی را ازSMTP به یک سرویس دیگر مثل SendGrid تغییر دهید. اگر تزریق وابستگی را رعایت نکرده باشید، این تغییر نیاز به اصلاح بخش‌های زیادی از کد خواهد داشت؛ اما با پیاده‌سازی درست، تنها کافی است که یک Dependency  جدید را در IoC Container ثبت کنید، بدون تغییر در کلاس‌های دیگر.
  6. پشتیبانی کامل درNET Core
    فریمورک ASP.NET Core به طور پیش‌فرض از تزریق وابستگی پشتیبانی می‌کند، بنابراین نیازی به نصب کتابخانه‌های اضافی نیست. این قابلیت به توسعه‌دهندگان کمک می‌کند که به‌سادگی مدیریت وابستگی‌ها را در پروژه‌های خود پیاده‌سازی کنند.

اشتباهات رایج در تزریق وابستگی در ASP.NET Core

تزریق وابستگی در asp net core  یک روش استاندارد برای مدیریت وابستگی‌ها و بهبود تست‌پذیری کد است، اما در برخی موارد، اشتباهات رایج در پیاده‌سازی این تکنیک می‌تواند باعث بروز مشکلاتی در عملکرد و نگهداری برنامه شود؛ در ادامه به برخی از این اشتباهات رایج و نحوه اجتناب از آن‌ها می‌پردازیم.

۱. ثبت نادرست طول عمر سرویس‌ها

یکی از مشکلات رایج، انتخاب اشتباه نوع طول عمر سرویس‌ها  (AddTransient، AddScoped، AddSingleton) است. برای مثال، استفاده از Singleton  برای سرویسی که به داده‌های متغیر وابسته است، می‌تواند باعث بروز مشکلات هم‌زمانی (Concurrency) شود.

۲. تزریق مستقیم DbContext به کنترلر

استفاده مستقیم از DbContext  در کنترلرها می‌تواند مشکلات کارایی ایجاد کند. به جای آن، بهتر است DbContext  در یک Repository یا Service Layer استفاده شود.

۳. استفاده بیش از حد از Singleton

تزریق وابستگی با AddSingleton  برای سرویس‌هایی که به داده‌های درخواست وابسته هستند، باعث ایجاد مشکلات در مدیریت وضعیت می‌شود. به عنوان مثال، اگر یک سرویس حاوی داده‌های کاربر باشد، استفاده از Singleton ممکن است داده‌ها را بین کاربران مختلف به اشتراک بگذارد.

۴. عدم استفاده از اینترفیس‌ها

برخی از توسعه‌دهندگان وابستگی‌ها را مستقیماً از کلاس‌های پیاده‌سازی شده ثبت می‌کنند، در حالی که استفاده از اینترفیس‌ها باعث افزایش انعطاف‌پذیری و تست‌پذیری کد می‌شود.

۵. تزریق وابستگی‌های زیاد در یک کلاس

اگر یک کلاس وابستگی‌های زیادی را از طریق سازنده (Constructor Injection) دریافت کند، نشان‌دهنده نقض اصل Single Responsibility Principle (SRP)  است. بهتر است این کلاس به بخش‌های کوچکتر تقسیم شده و برخی از وابستگی‌ها از طریق Factory Pattern  مدیریت شوند.

۶. عدم رعایت ترتیب وابستگی‌ها

ترتیب ثبت سرویس‌ها در IoC Container اهمیت زیادی دارد. برای مثال، ابتدا سرویس‌های پایه و سپس سرویس‌های وابسته باید ثبت شوند، در غیر این صورت، ممکن است در زمان اجرا خطاهای عدم یافتن سرویس (Service Not Found) دریافت کنید.

۷. استفاده از Service Locator

استفاده ازService Locator) ) مانند IServiceProvider.GetService<T>()  درون کلاس‌ها، وابستگی‌های پنهان ایجاد می‌کند و باعث کاهش خوانایی و نگهداری کد می‌شود. به جای این روش، باید تزریق وابستگی از طریق سازنده انجام شود.

استفاده از IServiceProvider.GetService()  درون کلاس‌ها، وابستگی‌های پنهان ایجاد می‌کند و باعث کاهش خوانایی و نگهداری کد می‌شود. به جای این روش، باید تزریق وابستگی از طریق سازنده انجام شود. با این حال، در برخی موقعیت‌های خاص، استفاده از IServiceProvider  منطقی است، از جمله:

  • در Middleware: زمانی که یک سرویس به‌صورت موقت و فقط در زمان اجرای یک درخواست خاص نیاز به وابستگی‌ها دارد.
  • در Factory Pattern: زمانی که باید وابستگی‌ها را به‌صورت داینامیک ایجاد و مدیریت کنیم.
  • در هنگام بارگذاری Lazy Dependency: در برخی موارد که نیاز نیست همه وابستگی‌ها از ابتدا مقداردهی شوند و بارگذاری آن‌ها باید به تأخیر بیفتد

نمونه استفاده در Middleware:

public class CustomMiddleware
{
    private readonly RequestDelegate _next;  
    public CustomMiddleware(RequestDelegate next)
    {
        _next = next;
    }
    public async Task Invoke(HttpContext context, IServiceProvider serviceProvider)
    {
        var messageService = serviceProvider.GetService<IMessageService>();
        messageService?.SendMessage("Middleware executed!");
        await _next(context);
    }
}

 

۸. عدم Dispose کردن سرویس‌های IDisposable

سرویس‌هایی که ازIDisposable  پیروی می‌کنند (مانند DbContext) باید به درستی مدیریت شوند. عدم Dispose کردن این سرویس‌ها می‌تواند باعث نشتی حافظه (Memory Leak) شود. معمولاً استفاده از Scoped Lifetime  برای این موارد مناسب‌تر است.

Best Practices برای پیاده‌سازی تزریق وابستگی (DI)

برای پیاده‌سازی بهینه تزریق وابستگی در ASP.NET Core، رعایت برخی از Best Practices ضروری است. این اصول به بهبود عملکرد، خوانایی و قابلیت نگهداری کد کمک می‌کنند:

۱. تزریق حداقلی (Minimum Injection)

تزریق وابستگی‌ها باید تا حد ممکن حداقلی باشد. اگر یک کلاس به چندین وابستگی نیاز دارد، این ممکن است نشان‌دهنده نیاز به تفکیک مسئولیت‌ها باشد. تزریق بیش از حد (Over-Injection) می‌تواند خوانایی کد را کاهش دهد و مدیریت آن را دشوار کند.

۲. رعایت اصل SRP (Single Responsibility Principle)

بر اساس اصل مسئولیت یگانه (SRP)، هر کلاس باید تنها یک مسئولیت داشته باشد. تزریق وابستگی‌های زیاد به یک کلاس ممکن است نشان‌دهنده نقض این اصل باشد. در چنین شرایطی، می‌توان کد را به چندین سرویس کوچک‌تر و مجزا تقسیم کرد.

 

dependency injection

 

۳. استفاده از Composition Root برای ثبت وابستگی‌ها

Composition Root مفهومی است که می‌گوید تمام وابستگی‌ها باید در بالاترین سطح برنامه (مثلاً در Program.cs یا Startup.cs) ثبت شوند. این روش باعث جلوگیری از پراکندگی ثبت وابستگی‌ها در سطح کد و افزایش خوانایی و مدیریت بهتر سرویس‌ها می‌شود.

نمونه‌ای از ثبت وابستگی‌ها در Composition Root:

public void ConfigureServices(IServiceCollection services)
{
    services.AddTransient<IExampleService, ExampleService>();
    services.AddScoped<IUserRepository, UserRepository>();
    services.AddSingleton<ILogger, ConsoleLogger>();
}

 

سرویس‌های اپلیکیشن می‌تواند باعث ایجاد وابستگی‌های پنهان شود که خوانایی و نگهداری کد را کاهش می‌دهد. در بیشتر موارد، بهتر است از تزریق وابستگی از طریق سازنده (Constructor Injection) استفاده شود.

۵. استفاده از Interface Segregation Principle (ISP)

در طراحی اینترفیس‌ها، نباید اینترفیس‌هایی طراحی شوند که کلاس‌ها را مجبور به پیاده‌سازی متدهایی کنند که به آن‌ها نیازی ندارند. بهتر است اینترفیس‌ها بر اساس نیاز واقعی تقسیم شوند تا کلاس‌ها وابستگی‌های غیرضروری نداشته باشند.

۶. مدیریت صحیح طول عمر سرویس‌ها

انتخاب طول عمر مناسب برای سرویس‌ها (AddTransient، AddScoped، AddSingleton) یکی از مهم‌ترین موارد در پیاده‌سازی DI است. هر کدام از این گزینه‌ها باید بر اساس نیاز برنامه و جلوگیری از مشکلات هم‌زمانی و مصرف غیرضروری حافظه انتخاب شوند.

۷. استفاده از Decorator Pattern برای تزریق وابستگی‌ها

یکی از روش‌های پیشرفته برای کنترل رفتار وابستگی‌ها، Decorator Pattern است. این روش به شما اجازه می‌دهد تا بدون تغییر در سرویس اصلی، قابلیت‌های بیشتری به آن اضافه کنید.

نمونه پیاده‌سازی Decorator Pattern:

public class LoggingExampleService : IExampleService
{
    private readonly IExampleService _inner;
    private readonly ILogger _logger;
    public LoggingExampleService(IExampleService inner, ILogger logger)
    {
        _inner = inner;
        _logger = logger;
    }
    public void Execute()
    {
        _logger.Log("Executing service");
        _inner.Execute();
    }
}

 

ثبت این سرویس در IoC Container:

services.AddTransient<IExampleService, ExampleService>();
services.Decorate<IExampleService, LoggingExampleService>();

 

۸. استفاده از Factory Pattern در مواقع ضروری

در برخی شرایط که سرویس‌ها نیاز به مقداردهی خاص دارند، استفاده از Factory Pattern یک رویکرد منطقی است. این روش به شما امکان می‌دهد تا وابستگی‌ها را به‌صورت داینامیک مقداردهی کنید.

services.AddTransient<IExampleService>(provider =>
    new ExampleService("Custom Configuration"));

 

سخن پایانی

تزریق وابستگی در asp. net core یکی از مهم‌ترین مفاهیم است که به بهبود نگهداری کد، تست‌پذیری و مقیاس‌پذیری کمک می‌کند. استفاده از کانتینر IoC داخلی ASP.NET Core، مدیریت وابستگی‌ها را ساده‌تر کرده و توسعه‌دهندگان را از استفاده از ابزارهای خارجی بی‌نیاز می‌کند. در این مقاله، نحوه ثبت سرویس‌ها، پیاده‌سازی عملی و استفاده از الگوهای پیشرفته در تزریق وابستگی را بررسی کردیم. همچنین، تفاوت بین AddTransient، AddScoped  و AddSingleton را توضیح دادیم تا شما بتوانید بهترین استراتژی را برای مدیریت وابستگی‌ها در پروژه‌های خود انتخاب کنید.

در نهایت، تزریق وابستگی نه‌تنها یک تکنیک توصیه‌شده در ASP.NET Core  است، بلکه به‌عنوان یک استاندارد در توسعه نرم‌افزار مدرن شناخته می‌شود که منجر به کدی تمیزتر و ماژولارتر خواهد شد. ما در نیک آموز منتظر نظرات ارزشمند شما درباره این مقاله هستیم.

سوالات متداول (FAQ)

۱. چرا تزریق وابستگی در ASP.NET Core اهمیت دارد؟

تزریق وابستگی باعث کاهش وابستگی‌های سخت‌کد شده، افزایش تست‌پذیری و بهبود ساختار کد می‌شود. همچنین، استفاده از IoC Container داخلی ASP.NET Core باعث ساده‌تر شدن مدیریت سرویس‌ها می‌شود.

۲. تفاوت بین AddTransient، AddScoped  و AddSingleton چیست؟

AddTransient  در هر درخواست، نمونه‌ای جدید ایجاد می‌شود. AddScoped  در طول یک درخواست  HTTP، یک نمونه ثابت ایجاد و استفاده می‌شود.AddSingleton  تنها یک نمونه در کل مدت اجرای برنامه نگه داشته می‌شود.

۳. چگونه می‌توان وابستگی‌ها را در Middleware تزریق کرد؟

برای تزریق وابستگی در Middleware، باید وابستگی‌ها را از طریق سازنده کلاس Middleware دریافت کرده و در IoC Container ثبت کنید. این کار باعث می‌شود که در هر درخواست، از سرویس‌های ثبت‌شده استفاده شود.

۴. آیا می‌توان از کتابخانه‌های شخص ثالث برای تزریق وابستگی استفاده کرد؟

بله، ASP.NET Core  به‌صورت داخلی از تزریق وابستگی پشتیبانی می‌کند، اما در صورت نیاز می‌توان از کتابخانه‌هایی مانند Autofac، Ninject، StructureMap و … برای مدیریت پیشرفته‌تر وابستگی‌ها استفاده کرد.

۵. چه زمانی باید از تزریق وابستگی در ASP.NET Core استفاده کرد؟

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

چه رتبه ای می‌دهید؟

میانگین ۰ / ۵. از مجموع ۰

اولین نفر باش

title sign
دانلود مقاله
تزریق وابستگی در asp.net core | بررسی اصول و بهترین روش‌ها
فرمت PDF
صفحه
حجم مگابایت
دانلود مقاله
شروع کمپین عید 1404
دوره Power Bi مقدماتی
title sign
معرفی نویسنده
تیم فنی نیک آموز
مقالات
414 مقاله توسط این نویسنده
محصولات
0 دوره توسط این نویسنده
تیم فنی نیک آموز
title sign
دیدگاه کاربران