در ادامه دوره پیشرفته Entity Framework Core 9، به آموزش Dependency Injection بپردازیم. همچنین با Interface آشنا شده. و نحوه ثبت سرویس در DI Container را یادمیگیریم. و در آخر به تزریق سرویس به کنترلر میپردازیم.
Dependency Injection یا DI یک الگوی طراحی است که به ما اجازه میدهد وابستگیهای یک شیء مثل سرویسها یا کلاسهای دیگر را از بیرون به آن تزریق کنیم. در ASP.NET Core قابلیت DI بهطور پیشفرض پیادهسازی شده است. و به ما کمک میکند تا کد تمیزتر، تستپذیرتر و قابل توسعهتری بنویسیم.
تزریق وابستگی یا Dependency Injection یک روش برنامه نویسی است که ایجاد و استفاده از اجزا را از هم جدا میکند.Dependency Injection شامل دو کلمه کلیدی است
فرض کنید نیاز به سرویسی نیاز داریم که میزان ارزش افزوده را بدست آورد. این ارزش افزوده در ۳ شهر به قرار است به صورت آزمایشی ایجاد شود. تهران، شیراز و اصفهان و در هر شهر مختلف است. در تهران ۲۰ درصد در شیراز ۱۵ درصد و در اصفحان ۱۰ درصد.
اینترفیس Interface چیست ؟ در واقع یک قرارداد است که مشخص میکند هر کلاسی که از آن استفاده میکند، باید چه متدها و پراپرتیهایی را پیادهسازی کند. Interface به برنامهنویسان این امکان را میدهند که وابستگیها را کمتر کنند و قابلیتهای بیشتری برای تست و توسعهی کد فراهم میکنند. نام اینترفیس خود را IAddValueService قرار داده و به صورت زیر متدهای آن را اضافه میکنیم.
public interface IAddValueService
{
int Tehran(int value);
int Shiraz(int value);
int Esfehan(int value);
}
یک سرویس با نام AddValueService اضافه میکنیم
public class AddValueService : IAddValueService
{
public int Esfehan(int value)
{
return (value*20)/100;
}
public int Shiraz(int value)
{
return (value * 15) / 100;
}
public int Tehran(int value)
{
return (value * 10) / 100;
}
}
در فایل Program.cs باید در بخش DI Container سرویس خود را معرفی و ثبت کنیم. برای ثبت سرویس از ۳ متد میتوان استفاده کرد. این انتخابها به شما امکان میدهند که بهترین روش را برای مدیریت طول عمر سرویسها متناسب با نیازهای برنامه خود استفاده کنید.
services.AddScoped<ITaxService, TaxService>();
services.AddSingleton<ITaxService, TaxService>();
services.AddSingleton<AddTransient, TaxService>();
در کنترلر میتوانیم سرویس را از طریق سازنده (Constructor) تزریق کنیم.
private readonly IAddValueService _service;
public HomeController(IAddValueService service)
{
_service = service;
}