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
Sfruttare lo streaming di una chiamata Http da Blazor
Workflow di continuous deployment tramite pull request label in GitHub
Gestione degli environment per il deploy con un workflow di GitHub
Evitare il flickering dei componenti nel prerender di Blazor 8
Utilizzare l'operatore GroupBy come ultima istruzione di una query LINQ in Entity Framework
Cache policy su route groups di Minimal API in ASP.NET Core 7
Gestire errori funzionali tramite exception in ASP.NET Core Web API
Elencare le container images installate in un cluster di Kubernetes
Generare file per il download da Blazor WebAssembly
Utilizzare le collection expression in C#
Eseguire operazioni sui blob con Azure Storage Actions
Effettuare il pull di git LFS in un workflow di GitHub