
آموزش Dependency Injection
در ادامه دوره پیشرفته Entity Framework Core 9، به آموزش Dependency Injection بپردازیم. همچنین با Interface آشنا شده. و نحوه ثبت سرویس در DI Container را یادمیگیریم. و در آخر به تزریق سرویس به کنترلر میپردازیم.
Dependency Injection چیست؟
Dependency Injection یا DI یک الگوی طراحی است که به ما اجازه میدهد وابستگیهای یک شیء مثل سرویسها یا کلاسهای دیگر را از بیرون به آن تزریق کنیم. در ASP.NET Core قابلیت DI بهطور پیشفرض پیادهسازی شده است. و به ما کمک میکند تا کد تمیزتر، تستپذیرتر و قابل توسعهتری بنویسیم.
تزریق وابستگی یا Dependency Injection یک روش برنامه نویسی است که ایجاد و استفاده از اجزا را از هم جدا میکند.Dependency Injection شامل دو کلمه کلیدی است
- وابستگیها: اجزای کد برای انجام وظایف خود به بسیاری از اشیا متکی هستند. وابستگیهای مختلفی مانند منابع خارجی، اشیاء دیگر یا خدمات وجود دارد.
- تزریق: کامپوننتها وابستگیهای داخلی را در Dependency Injection ایجاد نمیکنند. در عوض، این تکنیک وابستگیها را از بیرون فراهم میکند. یا به عبارتی تزریق میکند. این رویکرد بین اجزا و وابستگیها جدایی ایجاد میکند.
پیاده سازی عملی Dependency Injection
فرض کنید نیاز به سرویسی نیاز داریم که میزان ارزش افزوده را بدست آورد. این ارزش افزوده در ۳ شهر به قرار است به صورت آزمایشی ایجاد شود. تهران، شیراز و اصفهان و در هر شهر مختلف است. در تهران ۲۰ درصد در شیراز ۱۵ درصد و در اصفحان ۱۰ درصد.
قدم اول ایجاد Interface
اینترفیس 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;
}
}قدم سوم ثبت سرویس در DI Container
در فایل Program.cs باید در بخش DI Container سرویس خود را معرفی و ثبت کنیم. برای ثبت سرویس از ۳ متد میتوان استفاده کرد. این انتخابها به شما امکان میدهند که بهترین روش را برای مدیریت طول عمر سرویسها متناسب با نیازهای برنامه خود استفاده کنید.
متد AddScoped
هر بار که یک درخواست جدید به سرور ارسال شود، یک شیء جدید از سرویس ایجاد میشود. بنابراین، اگر چندین بار در طول یک درخواست از یک سرویس استفاده کنیم، همان شیء تکراری استفاده خواهد شد. زمان استفاده: وقتی نیاز دارید که یک سرویس در طول یک درخواست واحد از یک شیء واحد استفاده کند و در پایان درخواست آن شیء از بین برود.
services.AddScoped<ITaxService, TaxService>();متد AddSingleton
یک شیء واحد برای کل طول عمر برنامه ایجاد میشود و همه درخواستها (چه همزمان و چه جداگانه) از همان شیء واحد استفاده میکنند. زمان استفاده: وقتی نیاز دارید یک شیء را یک بار بسازید و از آن برای تمام درخواستها و در طول اجرای برنامه استفاده کنید، مانند سرویسهای دارای وضعیت ثابت (Stateful) یا تنظیمات پیکربندی.
services.AddSingleton<ITaxService, TaxService>();متد AddTransient
هر بار که یک شیء از سرویس نیاز شود، یک نمونه جدید ایجاد میشود. یعنی، با هر بار فراخوانی یا تزریق سرویس، یک شیء جدید تولید میشود. زمان استفاده: زمانی که نیاز دارید هر بار که سرویس فراخوانی میشود، یک شیء تازه ایجاد شود، مثلاً برای سرویسهایی که سبک هستند و وضعیت خاصی ندارند.
services.AddSingleton<AddTransient, TaxService>();| زمان مناسب برای استفاده | طول عمر | نوع سرویس |
|---|---|---|
| وقتی که سرویس فقط باید در طول یک درخواست HTTP | برای هر درخواست HTTP یک نمونه از سرویس ساخته میشود | Scoped |
| برای سرویسهایی که باید در کل برنامه یکسان باشند. | یک نمونه در کل طول عمر برنامه (یا تا زمان راهاندازی مجدد) | Singleton |
| برای سرویسهایی که سبک هستند و هر بار نیاز به نمونه جدید دارند. | هر بار که نیاز شد یک نمونه جدید ساخته میشود | Transient |
ثبت سرویس در DI Container
- استفاده از AddSingleton برای سرویسهایی که وضعیت (State) خاصی دارند که در طول برنامه تغییر میکند، ممکن است خطرناک باشد، زیرا همه درخواستها به همان وضعیت دسترسی دارند.
- متد AddScoped برای سناریوهایی که هر درخواست باید با دادههای منحصر به فرد کار کند، مناسب است.
- متد AddTransient برای سرویسهایی که وضعیت نگهداری نمیکنند و سبک هستند مناسب است، زیرا ایجاد مکرر شیء جدید هزینه زیادی ندارد.
قدم جهارم تزریق سرویس به کنترلر
در کنترلر میتوانیم سرویس را از طریق سازنده (Constructor) تزریق کنیم.
private readonly IAddValueService _service;
public HomeController(IAddValueService service)
{
_service = service;
}دانلود فایل ارائه
خرید از تهران آی تی به صورت آنلاین میباشد و لینک دانلود به صورت خودکار برای شما ایمیل میشود. همه گزینهها همان فایل کامل را به شما میدهند. تفاوت فقط در نحوه جبران هزینه است؛ انتخاب با وجدان شماست. چنانچه نیاز به هرگونه سوال و یا کمک در خرید آنلاین داشتید با شماره 09121486770 تماس بگیرید. شماره کارت ما 6362141104352035 به نام محمدرضا احدیان میباشد.

سورس کد EFCore9
شما میتوانید سورس کد کامل EFCore9 را از طریق گیت مشاهده کنید و یا اگر گیت کار نمیکنید، به راحتی آن را به صورت فایل فشرده (ZIP) دانلود کنید. فایلهای دانلودی شامل تمام بخشهای پروژه است و میتوانید آن را روی سیستم خود اجرا یا تغییر دهید.
































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