Внедрение зависимостей — это шаблон проектирования программного обеспечения, который используется для разработки программного обеспечения со слабосвязанным кодом. Внедрение зависимостей — отличный способ уменьшить тесную связь между программными компонентами, а также улучшить ремонтопригодность и очень легко управлять будущими изменениями и другими сложностями.

Давайте рассмотрим пример внедрения зависимостей,

Продуктконтроллер.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-запроса, но использует тот же экземпляр в других вызовах в рамках того же веб-запроса.

Преимущества внедрения зависимостей:

  • Снижает связанность классов
  • Увеличивает возможность повторного использования кода
  • Улучшает ремонтопригодность кода
  • Сделайте модульное тестирование возможным

Спасибо, увидимся в следующей статье!!

Вы можете связаться со мной здесь,

LinkedIn: https://www.linkedin.com/in/vaibhav-bhapkar

Электронная почта: [email protected]