تزریق وابستگی (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:
فقط یک نمونه در کل برنامه ساخته می شود.
سعی کردم که کاملا کد محور و کاربردی باشه، امیدوارم مفید واقع شده باشه.