Dependency Injection in ASP.NET Core

di Moreno Gentili, in ASP.NET Core,

In un precedente script (https://www.aspitalia.com/script/1229/Configurare-Middleware-Servizi-ASP.NET-Core.aspx), abbiamo visto come ASP.NET Core consenta di configurare dei servizi e sfruttarli attraverso la dependency injection.

Grazie a questo meccanismo possiamo:

  • Migliorare il disaccoppiamento tra i componenti della nostra applicazione, aumentandone la testabilità;
  • Gestire il ciclo di vita dei servizi, per non correre il rischio di dimenticare il rilascio delle risorse;
  • Riutilizzare le istanze nell'ambito di in una richiesta HTTP o dell'intera applicazione.

La dependency injection in ASP.NET Core è pervasiva e ciò significa che tutti i servizi saranno disponibili sia dai nostri Controller che dai Tag helper, View component e Middleware. Il modo tipico di ottenere il riferimento ad un servizio è quello di indicarlo tra i parametri del costruttore, come nel caso di questo Controller:

public class HomeController : Controller
{
  private readonly IRepository<Product> productRepo;
  
  //Ottengo un riferimento al servizio IRepository<Product>
  //indicandolo come parametro del costruttore
  public HomeController(IRepository<Product> productRepo)
  {
    this.productRepo = productRepo;
  }
}

In aggiunta, anche le action possono ricevere servizi dai parametri, purché siano decorati con l'attributo [FromServices]. In questo modo siamo ancor più puntuali nel richiedere la costruzione delle istanze.

public class HomeController : Controller
{
  public async Task<IActionResult> Index(
    [FromServices] IRepository<Product> productRepo
  )
  {
    var products = await productRepo.GetAllAsync();
    return View(products);
  }
}

Anche le view Razor possono avvalersi dei servizi mediante la direttiva @inject, che viene posta in cima al file .cshtml.

@using Microsoft.Extensions.Options;
@inject IOptions<WebsiteSettings> websiteSettings;
@model IEnumerable<Product>
<ul>  @foreach (var product in Model)
  {
    //Uso il servizio di configurazione ottenuto grazie ad @inject
    var imageWidth = websiteSettings.Value.ProductImageWidth;
    <li>
      <a asp-action="Detail"
        asp-controller="Product"
        asp-route-id="@product.ProductId">
        <figure>
          <img src="@product.ImageUrl" width="@imageWidth" />
          <figcaption>@product.Title</figcaption>
        </figure>
      </a>
    </li>
  }
</ul>

Trattandosi di una view, è preferibile che non contenga logica di business o di accesso ai dati. Pertanto, l'uso della dependency injection nelle view dovrebbe essere limitato ai servizi privi di comportamento, come la API di configurazione IOptions<T> mostrata in questo esempio e discussa in un precedente script (https://www.aspitalia.com/script/1231/Gestire-Parametri-Configurazione-ASP.NET-Core.aspx).

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi