.NET 8.0'da yeni [15]: Bağımlılık enjeksiyonuna karmaşık hizmetler

Womanne

Member
Yani “Anahtar Bağımlılık Enjeksiyon Hizmetleri” .NET 8.0'da yenidir. Bağımlılık enjeksiyon kabını yapılandırırken, kullanıcının başvurması gereken ek bir nesne belirlemek mümkündür.








Holger Schwichtenberg, 53 ünlü uzmanla tavsiye ve eğitim yoluyla ve yazılımın geliştirilmesinde çok sayıda orta ve büyük şirketi destekleyen uzmanlar ağının teknik direktörüdür. Çok sayıda ulusal ve uluslararası uzman konferansındaki görünümleri, 90'dan fazla uzman kitabı ve 1.500'den fazla uzman makalesi sayesinde Holger Schwichtenberg, Almanya'daki .NET ve Web teknikleri için en iyi uzmanlardan biridir.







Konteyneri doldururken:


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


VEYA


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


İle [FromKeyedServices("remote")] Üreticideki bağımlılık enjeksiyon kapındaki bir uygulama, başka bir sınıfın şifreli bir örneğini isteyebilir. Zorunlu Geçişler serviceProvider.GetKeyedService<T>(Schlüssel). Şifrelenmiş hizmet durumunda, şu ana kadar mevcut olanlar serviceProvider.GetRequiredService<T>() Olumsuz.

Aşağıdaki örnek, bir arayüzün adla iki farklı uygulamasını ayırt etmenin anahtarı olarak dize zincirlerini göstermektedir. 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 jilet bileşenlerinde ek açıklamada yapabilirsiniz [Inject] Şimdi ayrıca bir anahtar ad belirtir


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



Ancak, hala bunu yapabilme yeteneği yok @inject-Razor modelinin sözdiziminde kullanılacak yerler.


(RME)
 
Üst