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
Paginare i risultati con QuickGrid in Blazor
Proteggere le risorse Azure con private link e private endpoints
Utilizzare Container Queries nominali
Eseguire una ricerca avanzata per recuperare le issue di GitHub
Usare i settings di serializzazione/deserializzazione di System.Text.Json di ASP.NET all'interno di un'applicazione non web
Referenziare un @layer più alto in CSS
Gestione file Javascript in Blazor con .NET 9
Rendere i propri workflow e le GitHub Action utilizzate più sicure
Inference di dati strutturati da testo con Semantic Kernel e ASP.NET Core Web API
Sfruttare GPT-4o realtime su Azure Open AI per conversazioni vocali
Utilizzare il nuovo modello GPT-4o con Azure OpenAI
Migrare una service connection a workload identity federation in Azure DevOps