۲۹ شهریور ۱۴۰۳

Techboy

اخبار و اطلاعات روز تکنولوژی

چگونه وابستگی ها را در ASP.NET Core حل کنیم

سه راه مختلف برای حل وابستگی ها در ASP.NET Core 6، با استفاده از تزریق سازنده، تزریق متد عمل یا نمونه های IServiceProvider را بررسی کنید.

سه راه مختلف برای حل وابستگی ها در ASP.NET Core 6، با استفاده از تزریق سازنده، تزریق متد عمل یا نمونه های IServiceProvider را بررسی کنید.

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

تزریق وابستگی یک شهروند درجه یک در ASP.NET Core است. ارائه‌دهنده تزریق وابستگی داخلی در ASP.NET Core به اندازه کانتینرهای IoC (Inversion of Control) مانند StructureMap و Ninject از ویژگی‌های غنی برخوردار نیست، اما سریع، پیکربندی آسان و استفاده آسان است. می‌توانید هم سرویس‌های چارچوب و هم سرویس‌های کاربردی را در ASP.NET Core تزریق کنید.

این مقاله در مورد روش های مختلفی صحبت می کند که از طریق آنها می توانید وابستگی ها را در ASP.NET Core حل کنید.

برای کار با نمونه کدهای ارائه شده در این مقاله، باید Visual Studio 2022 را در سیستم خود نصب کنید. اگر قبلاً نسخه‌ای ندارید، می‌توانید Visual Studio 2022 را از اینجا بارگیری کنید.

یک پروژه ASP.NET Core در Visual Studio 2022 ایجاد کنید

ابتدا، اجازه دهید یک پروژه ASP.NET Core در Visual Studio 2022 ایجاد کنیم. با دنبال کردن این مراحل، یک پروژه ASP.NET Core Web API 6 جدید در Visual Studio 2022 ایجاد می کنیم:

  1. Visual Studio 2022 IDE را راه اندازی کنید.
  2. روی “ایجاد پروژه جدید” کلیک کنید.
  3. در پنجره “ایجاد پروژه جدید”، “ASP.NET Core Web API” را از لیست الگوهای نمایش داده شده انتخاب کنید.
  4. بعدی را کلیک کنید.
  5. در پنجره “پیکربندی پروژه جدید خود”، نام و مکان پروژه جدید را مشخص کنید.
  6. به صورت اختیاری، بسته به تنظیمات برگزیده خود، کادر انتخاب «قرار دادن راه حل و پروژه در یک فهرست راهنمای» را علامت بزنید.
  7. بعدی را کلیک کنید.
  8. در پنجره “اطلاعات اضافی” نشان داده شده در ادامه، .NET 6.0 را به عنوان چارچوب هدف از لیست کشویی در بالا انتخاب کنید. “نوع احراز هویت” را به عنوان “هیچ” (پیش‌فرض) بگذارید.
  9. مطمئن شوید که چک باکس های «Enable Docker»، «Configure for HTTPS» و «Enable Open Open API Support» علامت نخورده باشند زیرا ما از هیچ یک از این ویژگی ها در اینجا استفاده نخواهیم کرد. همچنین می‌توانید به‌صورت اختیاری علامت «استفاده از کنترل‌کننده‌ها (برای استفاده از حداقل APIها)» را بردارید زیرا ما در حال ایجاد کنترل‌کننده خودمان هستیم.
  10. روی ایجاد کلیک کنید.
ماندگاری جاوا با JPA و Hibernate: نهادها و روابط

این یک پروژه جدید ASP.NET Core 6 Web API در Visual Studio 2022 ایجاد می کند. ما از این پروژه برای نشان دادن حل وابستگی ها در بخش های بعدی این مقاله استفاده خواهیم کرد.

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

اکنون رابط زیر را ایجاد کنید:

    public interface ICustomFileLogger
    {
        public string Text { get; set; }
        public void Log(string message);
    }

برای سادگی، این یک نمایش حداقلی است. کلاس CustomFileLogger رابط ICustomFileLogger را همانطور که در قطعه کد زیر نشان داده شده است پیاده سازی می کند.

public class CustomFileLogger : ICustomFileLogger
{
   public string Text { get; set; }
   public void Log(string message)
   {
      //Write your own implementation here
   }
}

اگر از ASP.NET 5 استفاده می‌کنید، می‌توانید نمونه‌ای از نوع ICustomFileLogger را در روش ConfigureServices یا اگر از ASP.NET 6 استفاده می‌کنید در فایل Program.cs به‌عنوان یک سرویس دامنه‌دار ثبت کنید.

services.AddScoped<ICustomFileLogger, CustomFileLogger>();

بعد، یک کنترلر API به نام DefaultController ایجاد کنید و کد زیر را وارد کنید:

    [Route("api/[controller]")]
    [ApiController]
    public class DefaultController : ControllerBase
    {
        private ICustomFileLogger _logger;
        public DefaultController(ICustomFileLogger logger)
        {
            _logger = logger;
            if(string.IsNullOrEmpty(_logger.Text))
                _logger.Text = DateTime.UtcNow.ToString();
        }
        [HttpGet]
        public string Get()
        {
            return "Hello World!";
        }
    }

به نحوه استفاده از تزریق سازنده در اینجا توجه کنید. سازنده کلاس DefaultController نمونه ای از نوع ICustomFileLogger را به عنوان پارامتر می پذیرد.

کاتلین همچنان از شاخص محبوبیت Tiobe صعود می کند

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

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

قطعه کد زیر نشان می‌دهد که چگونه می‌توان به روش عمل تزریق شد.

[HttpPost("Log")]
public IActionResult Log([FromServices] ICustomFileLogger customFileLogger)
{
   //Write your code here
    return Ok();
}

شما ممکن است اغلب نیاز به تزریق سرویس های مختلف در کنترلر خود داشته باشید. اگر از تزریق سازنده استفاده می کنید، باید چندین پارامتر را در سازنده مشخص کنید. راه حل بهتر برای این کار استفاده از IServiceProvider است.

نحوه مدیریت مقادیر تهی در سی شارپ

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

می‌توانید از رابط IServiceCollection برای ایجاد یک ظرف تزریق وابستگی استفاده کنید. پس از ایجاد کانتینر، نمونه IServiceCollection در یک نمونه IServiceProvider ترکیب می شود. می توانید از این نمونه برای رفع سرویس ها استفاده کنید.

می‌توانید نمونه‌ای از نوع IServiceProvider را به هر روشی از یک کلاس تزریق کنید. همچنین می‌توانید از ویژگی ApplicationServices رابط IApplicationBuilder و ویژگی RequestServices کلاس HttpContext برای بازیابی یک نمونه IServiceProvider استفاده کنید.

قطعه کد زیر نشان می دهد که چگونه می توانید نمونه ای از نوع IServiceProvider را تزریق کنید.

public class DefaultController : Controller
{
    private IServiceProvider _provider;
    public DefaultController(IServiceProvider provider)
    {
        _provider = provider;
    }
}

می‌توانید از قطعه کد زیر در روش‌های اقدام خود برای بازیابی هر یک از نمونه‌های سرویس مورد نیاز خود استفاده کنید.

ICustomFileLogger logger = (ICustomFileLogger)_provider.GetService(typeof(ICustomFileLogger));

به نحوه استفاده از روش GetService IServiceProvider برای بازیابی نمونه سرویس توجه کنید.

می توانید از ویژگی RequestServices کلاس HttpContext برای بازیابی نمونه ای از نوع IServiceProvider استفاده کنید و سپس از این نمونه برای فراخوانی متد GetService استفاده کنید. کد زیر نشان می دهد که چگونه می توان این کار را انجام داد.

ICustomFileLogger logger = (ICustomFileLogger)HttpContext.RequestServices.GetService(typeof(ICustomFileLogger));

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