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
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Migliorare l'organizzazione delle risorse con Azure Policy
Creare una libreria CSS universale: Immagini
Come EF 8 ha ottimizzato le query che usano il metodo Contains
Creazione di componenti personalizzati in React.js con Tailwind CSS
Migliorare i tempi di risposta di GPT tramite lo streaming endpoint in ASP.NET Core
Usare lo spread operator con i collection initializer in C#
Miglioramenti nelle performance di Angular 16
Creazione di plugin per Tailwind CSS: espandere le Funzionalità del Framework
Supportare lo HierarchyID di Sql Server in Entity Framework 8
Utilizzare il metodo CountBy di LINQ per semplificare raggruppamenti e i conteggi
Visualizzare le change sul plan di Terraform tramite le GitHub Actions
Recuperare l'ultima versione di una release di GitHub