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
Gestire eccezioni nei plugin di Semantic Kernel in ASP.NET Core Web API
Utilizzare il metodo ExceptBy per eseguire operazione di sottrazione tra liste
Creare una libreria CSS universale: i bottoni
Rendere le variabili read-only in una pipeline di Azure DevOps
Gestire il colore CSS con HWB
Sfruttare al massimo i topic space di Event Grid MQTT
Il nuovo controllo Range di Blazor 9
Creare una libreria CSS universale: Cards
Eliminare una project wiki di Azure DevOps
Effettuare il binding di date in Blazor
Le novità di Angular: i miglioramenti alla CLI
Effettuare il log delle chiamate a function di GPT in ASP.NET Web API