Exemple d'exemple utilisant le noyau Asp.net
Lien vidéo enregistré : https://www.youtube.com/watch?v=oVj1IHw8GLU
AperçuOfDI : https://github.com/sandeepmvn/DependencyInjectionRepository/blob/master/OverviewOfDI.txt
ASP.NET Core prend en charge le modèle de conception logicielle d'injection de dépendances (DI), qui est une technique permettant de réaliser l'inversion de contrôle (IoC) entre les classes et leurs dépendances.
Grâce au conteneur IoC, nous pouvons réaliser
Dans le noyau Asp.net, IoC Container possède des interfaces intégrées.
Le cycle de vie DI suivant sera
Il existe essentiellement deux types de services dans ASP.NET Core :
Services de framework : services qui font partie du framework ASP.NET Core tels que IApplicationBuilder, IHostingEnvironment, ILoggerFactory, etc.
Services d'application : services (types ou classes personnalisés) que vous, en tant que programmeur, créez pour votre application.
Dépendances de demande du contrôleur Asp.Net Core MVC explicitement via les constructeurs 1. Injection de constructeur 2. Injection de méthode (niveau d'action) 3. Injection de propriété (non prise en charge) 4. Injection de vue
Injection de constructeur : - Les services sont ajoutés en tant que paramètre de constructeur et le runtime résout le service à partir du conteneur de services (IServiceCollection-- DiContainer). Les servicesa sont généralement définis à l'aide d'une classe non concrète (interfaces)
Injection de méthode : - L'utilisation de l'attribut [FromService] permet d'injecter un service directement dans une méthode d'action sans utiliser l'injection de contrôleur.
Injection de propriétés Actuellement (noyau Asp.net), le conteneur IOC intégré ne prend pas en charge l'injection de propriétés. Pour cela, vous pouvez opter pour des conteneurs de services intégrés (IOC) tiers.
La directive View Injection Using [Inject] permet d'injecter le service directement dans la page d'affichage sans utiliser de contrôleur ou d'injection de méthode.
Le conteneur IoC intégré prend en charge trois types de durée de vie :
Dans l'exemple d'exemple, l'interface de service « IMyDependency » définit la méthode « WriteMessage »
public interface IMyDependency
{
void WriteMessage(string message);
}
Cette interface est implémentée par un type concret, MyDependency :
public class MyDependency : IMyDependency
{
public void WriteMessage(string message)
{
Console.WriteLine($"MyDependency.WriteMessage Message: {message}");
}
}
Maintenant, enregistre le service "IMyDependency" avec le type concret "MyDependency" (dans startup.cs)
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.Add(new ServiceDescriptor(typeof(IMyDependency), new MyDependency()));
}
}
Ici, la méthode Add() de l'instance "IServiceCollection" est utilisée pour enregistrer un service auprès d'un conteneur IoC. Le « ServiceDescriptor » permet de préciser le type de service et sa mise en œuvre concrète. Cela enregistrera notre service dans un conteneur avec par défaut "Singleton".
Maintenant, injectons des services avec des durées de vie différentes
Singleton (Cas d'utilisation : lorsqu'on doit créer un service d'état) :
services.Add(new ServiceDescriptor(typeof(IMyDependency), new MyDependency(),ServiceLifetime.Singleton));
Transitoire (Cas d'utilisation : lorsque nous devons créer un service sans état) :
services.Add(new ServiceDescriptor(typeof(IMyDependency), new MyDependency(),ServiceLifetime.Transient));
Portée (Cas d'utilisation : Service de base de données) :
services.Add(new ServiceDescriptor(typeof(IMyDependency), new MyDependency(),ServiceLifetime.Scoped));
Nous pouvons également injecter les services en utilisant des méthodes d'extension intégrées
Singleton
services.AddSingleton
Transitoire
services.AddTransisent
Portée
services.AddScoped
public class HomeController : Contrôleur {privé en lecture seule IMyDependency _service ;
public HomeController(IMyDependency service)
{
_service = service;
}
public IActionResult Index()
{
_service.WriteMessage("Constructor level injection")
return View();
}
}
public class HomeController : Controller
{
//Fromservice attribute
public IActionResult Index([FromService]IMyDependency service)
{
service.WriteMessage("Action level injection")
return View();
}
}
classe publique HomeController : Contrôleur {
public IActionResult Index()
{
return View();
}
}
Dans Index.cshtml
@{ ViewData["Titre"] = "Page d'accueil"; }
//using Inject directive
@inject IMyDependency service
//code block
@{
service.WriteMessage("View level Injection");
}
classe publique HomeController : Contrôleur {
public IActionResult Index()
{
var services = this.HttpContext.RequestServices;
var dependencyservice = (IMyDependency)services.GetService(typeof(IMyDependency));
dependencyservice.WriteMessage("without injection, accessing dependent services");
return View();
}
}