.NET 8.0'daki yenilikler [15]: Bağımlılık enjeksiyonunda şifrelenmiş hizmetler

Saberie

Active member
“Anahtarlı bağımlılık enjeksiyon hizmetleri” olarak adlandırılan hizmetler .NET 8.0'da yenidir. Bağımlılık Enjeksiyonu kapsayıcısını yapılandırdığınızda kullanıcının referans vermesi için ek bir nesne belirtebilirsiniz.

Duyuru









Dr. Holger Schwichtenberg, 53 tanınmış uzmanıyla çok sayıda orta ve büyük ölçekli şirketi danışmanlık, eğitim ve yazılım geliştirme yoluyla destekleyen www.IT-Visions.de uzman ağının teknik direktörüdür. Çok sayıda ulusal ve uluslararası konferansa katılımı, 90'dan fazla uzmanlık kitabı ve 1.500'den fazla uzmanlık makalesi sayesinde Holger Schwichtenberg, .NET ve web teknolojileri konusunda Almanya'nın en tanınmış uzmanlarından biridir.







Kullandığınız kabı doldurduğunuzda:


services.AddKeyedSingleton<Klasse>(Schlüssel);


VEYA


services.AddKeyedSingleton<Schnittstelle, Klasse>(Schlüssel);


İle [FromKeyedServices("remote")] Bağımlılık enjeksiyon kapsayıcısındaki bir örnek, yapıcıdaki başka bir sınıfın sabit kodlanmış bir örneğini gerektirebilir. Zorunlu olarak geçer serviceProvider.GetKeyedService<T>(Schlüssel). Anahtarlı bir hizmetle, halihazırda mevcut olan şey işe yarar serviceProvider.GetRequiredService<T>() Olumsuz.

Aşağıdaki örnek, adlandırılmış bir arayüzün iki farklı uygulamasını birbirinden ayırmanın anahtarı olarak dizeleri gösterir. IDataProvider.


using ITVisions;
using Microsoft.Extensions.DependencyInjection;

namespace NET8_Console;

interface IDataProvider
{
public string Name { get; set; }
public List<Object> GetData();
}

class LocalData : IDataProvider
{
public string Name { get; set; } = "Lokale Daten";
public List<Object> GetData()
{
return new List<Object>(); // irgendwas Lokales }
}
}

class RemoteData : IDataProvider
{
public string Name { get; set; } = "Daten von WebAPI";
public List<Object> GetData()
{
return new List<Object>(); // 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
{
/// <summary>
/// Dependency Injection mit Schlüsseln
/// Geht auch in Blazor mit [Inject],
/// aber in .NET 8.0 noch nicht mit @inject :-(
/// </summary>
public void Run()
{
#region DI-Container konfigurieren
var services = new ServiceCollection();
services.AddSingleton<LocalDataConsumer>();
services.AddSingleton<RemoteDataConsumer>();

// Neu: Angabe von Schlüsseln bei Add...()
// --> können beliebige Objekte sein!
services.AddKeyedSingleton<IDataProvider, LocalData>("local");
services.AddKeyedSingleton<IDataProvider, RemoteData>("remote");

var serviceProvider = services.BuildServiceProvider();
#endregion

#region DI nutzen

// Das geht nicht, da kein Schlüssel angegeben!
try
{
var service =
serviceProvider.GetRequiredService<IDataProvider>();
}
catch (Exception ex)
{
// 'No service for type 'NET8_Console.IDataProvider'
// has been registered.'
CUI.PrintError(ex.Message);
}

var service1 =
serviceProvider.GetKeyedService<IDataProvider>("local");
Console.WriteLine(service1.Name); // Lokale Daten
Console.WriteLine(service1.GetData().Count); // Lokale Daten

var service2 =
serviceProvider.GetKeyedService<IDataProvider>("remote");
Console.WriteLine(service2.Name); // Daten von WebAPI
Console.WriteLine(service2.GetData().Count); // Lokale Daten

var service3 =
serviceProvider.GetRequiredService<RemoteDataConsumer>();
Console.WriteLine(service3.ToString()); // Daten von WebAPI
}
#endregion
}



ASP.NET Core Blazor'daki Razor Bileşenlerinde ek açıklamayı kullanabilirsiniz [Inject] şimdi ayrıca şöyle bir anahtar adı da belirtiyor:


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



Ancak bunu yapabilecek kapasite henüz yetersiz @inject-Razor şablon sözdiziminde kullanılacak yönerge.


(kendim)



Haberin Sonu
 
Üst