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
Usare le collection expression per inizializzare una lista di oggetti in C#
Effettuare il deploy di immagini solo da container registry approvati in Kubernetes
Semplificare il deployment di siti statici con Azure Static Web App
Personalizzare l'errore del rate limiting middleware in ASP.NET Core
Utilizzare domini personalizzati gestiti automaticamente con Azure Container Apps
Load test di ASP.NET Core con k6
Utilizzare politiche di resiliency con Azure Container App
Accesso sicuro ai secrets attraverso i file in Azure Container Apps
Usare Refit e Polly in Blazor per creare client affidabili e fortemente tipizzati
Filtrare e rimuovere gli elementi dalla cache del browser tramite le API JavaScript
Limitare le richieste lato server con l'interactive routing di Blazor 8
Implementare il throttling in ASP.NET Core
I più letti di oggi
- Utilizzare WebAssembly con .NET, ovunque
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Ottimizzare le performance delle collection con le classi FrozenSet e FrozenDictionary
- Utilizzare il trigger SQL con le Azure Function
- Ottimizzazione dei block template in Angular 17
- Disabilitare automaticamente un workflow di GitHub (parte 2)