دوره های آموزشی سایت دانشجویار

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

Loading...
تزریق وابستگی در ASP.NET Core

 

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

IoC container از پیش ساخته شده:

فریمورک ASP.NET Core شامل یک IoC container ساده و در دسترس است که بسیاری از امکانات کتابخانه های IoC container دیگر را ندارد. اگر به دنبال امکانات بیشتری مانند رجیستر خودکار، اسکن کردن، interceptor، یا decorator هستید می توانید IoC container تعبیه شده را با یک کتابخانه container عوض کنید.

Container تعبیه شده به وسیله پیاده سازی IServiceProvider ارائه می شود که به طور پیش فرض تزریق سازنده را پشتیبانی می کند. نوع ها (کلاس ها)ی مدیریت شده توسط IoC container از پیش ساخته شده سرویس ها نامیده می شوند.

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

اساسا دو نوع از سرویس ها در ASP.NET Core وجود دارد:

۱- سرویس های فریمورک: سرویس هایی که بخشی از فریمورک ASP.NET Core هستند مانند IApplicationBuilder، IHostingEnvironment، ILoggerFactory و غیره.

۲- سرویس های اپلیکیشن: این سرویس ها (نوع های سفارشی یا کلاس ها) که شما به عنوان برنامه نویس برای اپلیکیشن خود می سازید.

برای اینکه IoC container به صورت اتوماتیک سرویس های اپلیکیشن ما را تزریق کند، ابتدا باید آنها را با IoC container رجیستر کنیم.

رجیستر سرویس اپلیکیشن:

مثال زیر از اینترفیس ILog و کلاس پیاده سازی آن را درنظر بگیرید. در ادامه می بینیم که چگونه آن را با IoC container تعبیه شده رجیستر کرده و در اپلیکیشن خود استفاده می کنیم.

public interface ILog
{
    void info(string str);
}

class MyConsoleLogger : ILog
{
    public void info(string str)
    {
        Console.WriteLine(str);
    }
}

ASP.NET Core این امکان را به ما می دهد که سرویس اپلیکیشن خود را با IoC container در متد ConfigureServices کلاس Startup رجیستر کنیم. متد ConfigureServices شامل پارامتری از نوع IServiceCollection است که برای رجیستر سرویس های اپلیکیشن استفاده می شود.

به این ترتیب ILog بالا را به شکل زیر با IoC container در متد ConfigureServices رجیستر می کنیم.

مثال: رجیستر سرویس

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.Add(new ServiceDescriptor(typeof(ILog), new MyConsoleLogger()));        
    }

    // other code removed for clarity.. 
}

همانطور که در کد بالا می بینید، متد Add شی IServiceCollection برای رجیستر یک سرویس با IoC container استفاده می شود. ServiceDescriptor برای مشخص کردن نوع یک سرویس و نمونه (instance) آن استفاده می شود. ما ILog را به عنوان نوع سرویس و MyConsoleLogger را به عنوان نمونه آن مشخص کرده ایم. این کار سرویس ILog را به طور پیش فرض به عنوان یک singleton رجیستر خواهد کرد. حالا، یک IoC container یک شی singleton از کلاس MyConsoleLogger ایجاد کرده و آن را در سازنده کلاس ها در هرجایی سرتاسر اپلیکیشن که ما ILog را به عنوان یک سازنده یا پارامتر متد وارد کرده ایم، تزریق می کند.

بنابراین، ما می توانیم سرویس های سفارشی اپلیکیشن خود را با IoC container در اپلیکیشن ASP.NET Core رجیستر کنیم. متدهای افزونه دیگری هم برای رجیستر سریع و آسان سرویس ها وجود دارد که در ادامه به آنها می پردازیم.

<      پیشنهاد می شود   />آموزش ASP.NET Core

بررسی چرخه حیات سرویس:

IoC container تعبیه شده چرخه حیات نوع سرویس رجیسترشده را مدیریت می کند و به طور خودکار براساس چرخه حیات مشخص شده یک نمونه سرویس را از بین می برد.

IoC container تعبیه شده سه نوع چرخه حیات را پشتیبانی می کند:

  1. Singleton: IoC container یک نمونه واحد از یک سرویس را در سرتاسر چرخه حیات اپلیکیشن ایجاد کرده و به اشتراک می گذارد.
  2. Transient (ناپایدار – زودگذر): IoC container یک نمونه از نوع سرویس مشخص شده را هر زمانی که شما از آن درخواست کنید می سازد.
  1. Scoped: IoC container یک نمونه از نوع سرویس مشخص شده را یکبار در هر درخواست ایجاد می کند و در یک درخواست واحد به اشتراک خواهد گذاشت.

مثال زیر نشان می دهد که چگونه یک سرویس با چرخه حیات های مختلف رجیستر می شود.

مثال: رجیستر یک سرویس با چرخه حیات

public void ConfigureServices(IServiceCollection services)
{
    services.Add(new ServiceDescriptor(typeof(ILog), new MyConsoleLogger()));    // singleton
    
    services.Add(new ServiceDescriptor(typeof(ILog), typeof(MyConsoleLogger), ServiceLifetime.Transient)); // Transient
    
    services.Add(new ServiceDescriptor(typeof(ILog), typeof(MyConsoleLogger), ServiceLifetime.Scoped));    // Scoped
}

متدهای افزونه برای رجیستر کردن

فریمورک ASP.NET Core برای هریک از انواع چرخه حیات متدهای افزونه ای را شامل می شود؛ متدهای AddSingleton()، AddTransient() و AddScoped() به ترتیب برای چرخه حیات singleton، transient و scoped.

مثال زیر روش های رجیستر انواع (سرویس ها) با استفاده از متدهای افزونه را نشان می دهد.

مثال: متدهای افزونه

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<ILog, MyConsoleLogger>();
    services.AddSingleton(typeof(ILog), typeof(MyConsoleLogger));

    services.AddTransient<ILog, MyConsoleLogger>();
    services.AddTransient(typeof(ILog), typeof(MyConsoleLogger));

    services.AddScoped<ILog, MyConsoleLogger>();
    services.AddScoped(typeof(ILog), typeof(MyConsoleLogger));
}

تزریق سازنده

زمانی که ما یک سرویس را رجیستر می کنیم، اگر یک نوع سرویس به عنوان پارامتری در یک سازنده وارده شده باشد، IoC container به طور خودکار تزریق سازنده را انجام می دهد.

برای مثال، ما می توانیم نوع سرویس ILog را در هر کنترلر MVC استفاده کنیم. مثال زیر را در نظر بگیرید.

مثال: استفاده از سرویس

public class HomeController : Controller
{
    ILog _log;

    public HomeController(ILog log)
    {
        _log = log;
    }
    public IActionResult Index()
    {
        _log.info("Executing /home/index");

        return View();
    }
}

در مثال بالا، یک IoC container به صورت خودکار یک نمونه از MyConsoleLogger را به سازنده HomeController ارسال می کند و لازم نیست ما کاری انجام دهیم. یک IoC container یک نمونه از ILog را براساس چرخه حیات رجیسترشده ایجاد کرده و از بین می برد.

تزریق  Action method:

بعضی اوقات ممکن است ما نوع سرویس وابستگی را در یک action method نیاز داشته باشیم. برای این کار، از صفت [FromServices] با پارامتر نوع سرویس در متد استفاده می کنیم.

مثال: تزریق Action Method

using Microsoft.AspNetCore.Mvc;

public class HomeController : Controller
{

    public HomeController()
    {
    }

    public IActionResult Index([FromServices] ILog log)
    {
        log.info("Index method executing");

        return View();
    }
}

تزریق Property:

IoC container تعبیه شده از تزریق property استفاده نمی کند و بنابراین باید از کتابخانه های IoC container استفاده کنیم.

گرفتن سرویس ها به صورت دستی:

لازم نیست که سرویس های وابستگی را در سازنده وارد کنیم. می توانیم با IoC container تعبیه شده به صورت دستی با استفاده از property به نام RequestServices متعلق به HttpContext به سرویس های وابسته پیکربندی شده دسترسی پیدا کرد.

مثال: گرفتن نمونه سرویس به صورت دستی

public class HomeController : Controller
{

    public HomeController()
    {
    }
    public IActionResult Index()
    {
        var services = this.HttpContext.RequestServices;
        var log = (ILog)services.GetService(typeof(ILog));
            
        log.info("Index method executing");
    
        return View();
    }
}

به جای استفاده از RequestServices برای به دست آوردن سرویس، تزریق سازنده توصیه می شود.

در بخش بعدی درباره میان افزار صحبت خواهیم کرد، منتظر ما باشید.



avatar فاطمه زکایی

فاطمه زکایی هستم. فارغ التحصیل کارشناسی مهندسی نرم افزار، مدت سه سال هست که در زمینه توسعه اپلیکیشن های تحت وب و اندروید و همچنین تولید محتوای تخصصی برنامه نویسی تحت وب و اندروید در مجموعه mspsoft در خدمت شما هستم.

آخرین مطالب و تخفیفات در کانال تلگرام :) کانال تلگرام ام اس پی سافت
مطالب مرتبط
ديدگاه خود را ارسال کنيد


محبوب ترين ويدئو هاي انلاين
دوره برنامه نویسی فروشگاه اینترنتی
  • تعداد اعضا 80k
  • قيمت دوره۱۳۰,۰۰۰ تومان
  • امتيازدهي
    1 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 5( 5٫00 از 1 رای )
    Loading...
دوره آموزشی سیستم ثبت سفارش آنلاین
  • تعداد اعضا 80k
  • قيمت دوره--
  • امتيازدهي
    1 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 5( 5٫00 از 1 رای )
    Loading...
دوره طراحی سیستم مدیریت مشتریان
  • تعداد اعضا 80k
  • قيمت دوره۶۵,۵۰۰ تومان
  • امتيازدهي
    1 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 5( 5٫00 از 1 رای )
    Loading...