Nouvelles Du Monde

Nouveau dans .NET 8.0 [15]: Services chiffrés en injection de dépendances

Nouveau dans .NET 8.0 [15]: Services chiffrés en injection de dépendances

2024-03-22 16:39:00

Sogenannte “Services d’injection de dépendances à clé” sont nouveaux dans .NET 8.0. Lors de la configuration du conteneur d’injection de dépendances, un objet supplémentaire peut être spécifié auquel l’utilisateur doit se référer.

Publicité


Dr. Holger Schwichtenberg est le directeur technique du réseau d’experts www.IT-Visions.de qui, avec 53 experts renommés, soutient de nombreuses moyennes et grandes entreprises par le biais de conseils et de formations ainsi que de développement de logiciels. Grâce à ses participations à de nombreuses conférences nationales et internationales ainsi qu’à plus de 90 ouvrages spécialisés et plus de 1 500 articles spécialisés, Holger Schwichtenberg est l’un des experts les plus connus en Allemagne dans le domaine des technologies .NET et Web.

Lors du remplissage du récipient que vous utilisez :

services.AddKeyedSingleton(Schlüssel);

ou

services.AddKeyedSingleton(Schlüssel);

Avec [FromKeyedServices("remote")] Une instance dans le conteneur d’injection de dépendances peut demander une instance codée d’une autre classe dans le constructeur. Impérativement ça passe serviceProvider.GetKeyedService(Schlüssel). Avec un service à clé, ce qui est déjà disponible fonctionne serviceProvider.GetRequiredService() pas.

L’exemple suivant montre les chaînes comme clé permettant de distinguer deux implémentations différentes d’une interface nommée IDataProvider.

using ITVisions;
using Microsoft.Extensions.DependencyInjection;
 
namespace NET8_Console;
 
interface IDataProvider
{
 public string Name { get; set; }
 public List GetData();
}
 
class LocalData : IDataProvider
{
 public string Name { get; set; } = "Lokale Daten";
 public List GetData()
 {
  return new List(); // irgendwas Lokales }
 }
}
 
class RemoteData : IDataProvider
{
 public string Name { get; set; } = "Daten von WebAPI";
 public List GetData()
 {
  return new List(); // irgendwas vom WebAPI }
 
 }
}
 
class LocalDataConsumer([FromKeyedServices("local")] 
                        IDataProvider data)
{
 public override string ToString()
 {
  return data.Name + ": " + data.GetData().Count + " Datensätze!";
 }
}
 
class RemoteDataConsumer([FromKeyedServices("remote")] 
                         IDataProvider data)
{
 public override string ToString()
 {
  return data.Name + ": " + data.GetData().Count + " Datensätze!";
 }
}
 
class FCL_DI
{
 /// 
 /// Dependency Injection mit Schlüsseln
 /// Geht auch in Blazor mit [Inject], 
 /// aber in .NET 8.0 noch nicht mit @inject :-(
 /// 
 public void Run()
 {
  #region DI-Container konfigurieren
  var services = new ServiceCollection();
  services.AddSingleton();
  services.AddSingleton();
 
  // Neu: Angabe von Schlüsseln bei Add...() 
  // --> können beliebige Objekte sein!
  services.AddKeyedSingleton("local");
  services.AddKeyedSingleton("remote");
 
  var serviceProvider = services.BuildServiceProvider();
  #endregion
 
  #region DI nutzen
 
  // Das geht nicht, da kein Schlüssel angegeben!
  try
  {
   var service = 
    serviceProvider.GetRequiredService();
  }
  catch (Exception ex)
  {
   // 'No service for type 'NET8_Console.IDataProvider' 
   // has been registered.'
   CUI.PrintError(ex.Message);
  }
 
  var service1 =
    serviceProvider.GetKeyedService("local");
  Console.WriteLine(service1.Name); // Lokale Daten
  Console.WriteLine(service1.GetData().Count); // Lokale Daten
 
  var service2 = 
    serviceProvider.GetKeyedService("remote");
  Console.WriteLine(service2.Name); // Daten von WebAPI
  Console.WriteLine(service2.GetData().Count); // Lokale Daten
 
  var service3 = 
    serviceProvider.GetRequiredService();
  Console.WriteLine(service3.ToString()); // Daten von WebAPI
 }
 #endregion
}

Dans les composants Razor dans ASP.NET Core Blazor, vous pouvez utiliser l’annotation [Inject] spécifiez maintenant également un nom de clé tel que

[Inject(Key="remote")]
public IDataProvider MeinDataProvider { get; set; }

Cependant il lui manque encore la capacitéceci au @inject-Directive à utiliser dans la syntaxe du modèle Razor.


(moi)

Vers la page d’accueil



#Nouveau #dans #.NET #Services #chiffrés #injection #dépendances
1711193902

Facebook
Twitter
LinkedIn
Pinterest

Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.

ADVERTISEMENT