سعید صفایی| Saeed Safaee
سعید صفایی| Saeed Safaee
خواندن ۲ دقیقه·۴ سال پیش

قدم به قدم تزریق وابستگی و طول عمر سرویس در Net Core.

تزریق وابستگی (DI) یک الگوی طراحی است که در بین برنامه نویسان مرسوم و اغلب پیشنهاد می شود.

DI
DI


در این مقاله، توضیح خواهم داد که چگونه می توانیم از Dependency Injection استفاده کنیم و تفاوت سه طول عمر services در برنامه های دات نت کور(dotnet core) چیست.
Transient و Scoped و Singleton


ما یک سرویس رو به صورت عموم(generic) در تعریف میکنیم:در فولدر IServices به همراه شرط و محدودیت
public interface IGenericService<T> where T : BaseModel { Task<List<T>> GetList(); Task<T> GetItem(Guid ID); }

در کلاس بالا یک اینترفیس عمومی تعریف کردیم و محدود کردیم به کلاس هایی که از BaseModel هستند.
ما دو متد برای لیست و یک آیتم تعریف کردیم

طبیعتا BaseModel رو اینگونه تعریف میکنیم:

public class BaseModel { public int ID { get; set; } }

حالا مدل کاربر رو درست میکنم و از BaseModel ارث میبریم:

public class User : BaseModel { public Guid UID { get; set; } public string Firstname { get; set; } public string Lastname { get; set; } public string Email { get; set; } }

حالا باید سرویس User را درست کنیم، که از سرویس Generic ارث بری میکند

public interface IUserService: IGenericService<Models.User> { }

همانگونه میبینیم سرویس generic محدود کردیم به کلاس هایی که از basemodel استفاده میکنند و مدل user هم از کلاس basemodel ارث بری میکند

این کار باعث میشود که سرویس عمومی به درستی استفاده شود و سرویس های دیگر اشتباهی استفاده نشوند


اکنون باید سرویس پایه برای کاربران را بسازیم: فولدری با نام services میسازیم و کلاس UserService.cs رو میسازیم:

public class UserService : IServices.IUserService { public async Task<List<User>> GetList() { //return list users } public async Task<User> GetItem(Guid ID) { //return one user } }


اکنون در Startupبرنامه در بخش ConfigureServices :

public void ConfigureServices(IServiceCollection services) { services.AddControllers(); services.AddScoped<IUserService, UserService>(); }


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

public class UserController : ControllerBase { private readonly Services.IUserService _service;
public UserController(Services.IUserService service) { _service = service; } [HttpGet] public async Task<Models.ResponseModel> List() { var list = await _service.GetList(); return list; } }


اما طول عمر سرویس ها(نوع سرویس ها):

نوع Transient:
این نوع برای حالت های سبک است، هرجا که درخواست شود ایجاد می شود.

نوع Scoped:
طول این نوع در هر درخواست ایجاد میشود. برای حالت های معمول این مورد پیشنهاد میشود.

نوع Singleton:
فقط یک نمونه در کل برنامه ساخته می شود.


سعی کردم که کاملا کد محور و کاربردی باشه، امیدوارم مفید واقع شده باشه.


سی شارپdependency injectionبرنامه نویسیمهندسی نرم افزار
Senior back-end developer | ProjectManager
شاید از این پست‌ها خوشتان بیاید