Внедрение зависимостей — это шаблон проектирования программного обеспечения, который используется для разработки программного обеспечения со слабосвязанным кодом. Внедрение зависимостей — отличный способ уменьшить тесную связь между программными компонентами, а также улучшить ремонтопригодность и очень легко управлять будущими изменениями и другими сложностями.
Давайте рассмотрим пример внедрения зависимостей,
Продуктконтроллер.cs
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using DIExample.Models; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; namespace DIExample.Controllers { [ApiController] [Route(“[controller]”)] public class ProductController : ControllerBase { private readonly IProductDetails _productDetails; public ProductController(IProductDetails productDetails) { _productDetails = productDetails; } public string Index() { return _productDetails.GetProduct(); } } }
ProductDetails.cs
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace DIExample.Models { public class ProductDetails : IProductDetails { public string GetProduct() { return “TestProduct”; } } }
IProductDetails.cs
namespace DIExample.Models { public interface IProductDetails { string GetProduct(); } }
Здесь,
- ProductController зависит от IProductDetails для получения данных о продуктах.
- Вместо создания нового экземпляра реализации IProductDetails мы внедряем экземпляр IProductDetails в ProductController с помощью конструктора.
- Это называется внедрением конструктора, так как мы используем конструктор для внедрения зависимости.
- Обратите внимание, мы назначаем введенную зависимость частному полю только для чтения, это хорошая практика, поскольку она предотвращает случайное присвоение другого значения внутри метода.
- На этом этапе, когда вы запустите свой проект, вы получите следующее исключение:
«InvalidOperationException: невозможно разрешить службу для типа DIExample.Models.IPProductDetails» при попытке активировать «DIExample.Controllers.ProductController». Это связано с тем, что контейнер DI не знает, какой объект предоставить, если некоторые запросы и объект реализуют IProductDetails.
Чтобы решить эту проблему, нам нужно зарегистрировать класс ProductDetails в контейнере DI, мы делаем этот метод ConfigureService() класса запуска.
public void ConfigureServices(IServiceCollection services) { services.AddControllers(); services.AddSingleton<IProductDetails, ProductDetails>(); }
Существуют разные способы регистрации службы в DI Container, давайте рассмотрим эти типы ниже.
Эти методы классифицируются по сроку действия зарегистрированной службы.
AddSingleton() — метод AddSingleton() создает службу Singleton. Служба Singleton создается при первом запросе. Этот же экземпляр затем используется всеми последующими запросами. Это означает, что один экземпляр создается для каждого приложения, и один и тот же экземпляр используется во всем приложении.
AddTransient() — метод AddTransient() создает новый экземпляр службы Transient при каждом запросе.
AddScoped() — этот метод создает службу Scoped. Новый экземпляр службы Scoped создается один раз для каждого запроса в пределах области. Например, в веб-приложении он создает 1 экземпляр для каждого HTTP-запроса, но использует тот же экземпляр в других вызовах в рамках того же веб-запроса.
Преимущества внедрения зависимостей:
- Снижает связанность классов
- Увеличивает возможность повторного использования кода
- Улучшает ремонтопригодность кода
- Сделайте модульное тестирование возможным
Спасибо, увидимся в следующей статье!!
Вы можете связаться со мной здесь,
Электронная почта: [email protected]