Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu başlangıç kılavuzunda, bir ServiceCollection ve karşılık gelen ServiceProvider öğesini manuel olarak oluşturan bir .NET konsol uygulaması oluşturacaksınız. Bağımlılık ekleme (DI) kullanarak hizmetleri kaydetmeyi ve çözmeyi öğrenirsiniz. Bu makalede, .NET'te DI'nin temellerini göstermek için Microsoft.Extensions.DependencyInjection NuGet paketi kullanılır.
Uyarı
Bu makale Generic host özelliklerinden yararlanmaz. Daha kapsamlı bir kılavuz için bkz. .NET'te bağımlılık eklemeyi kullanma.
Get started
Başlamak için DI.Basics adlı yeni bir .NET konsol uygulaması oluşturun. Visual Studio'da Dosya > Yeni Proje seçeneklerini seçin veya .NET CLI kullanarak komut satırına dotnet new console komutunu girin.
Ardından, proje dosyasındaki Microsoft.Extensions.DependencyInjection dosyasına bir paket başvurusu ekleyin. Paketi ekledikten sonra projenin DI.Basics.csproj dosyasının aşağıdaki XML'sine benzediğinden emin olun:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="10.0.8" />
</ItemGroup>
</Project>
Bağımlılık enjeksiyonu ile ilgili temel bilgiler
Bağımlılık ekleme, sabit kodlanmış bağımlılıkları kaldırmak ve uygulamanızı daha sürdürülebilir ve test edilebilir hale getirmek için kullanabileceğiniz bir tasarım desenidir. DI, sınıflar ve bağımlılıkları arasında Denetimin TersIni (IoC) elde etmeye yönelik bir tekniktir.
Microsoft.Extensions.DependencyInjection.Abstractions NuGet paketi.NET'te DI için soyutlamaları tanımlar:
- IServiceCollection: Hizmet tanımlayıcıları koleksiyonu için bir sözleşme tanımlar.
- IServiceProvider: Hizmet nesnesini almak için bir mekanizma tanımlar.
- ServiceDescriptor: Bir hizmeti hizmet türü, uygulaması ve ömrüyle açıklar.
DI'yi, hizmetleri ekleyip ve IServiceCollection içinde yapılandırarak yönetirsiniz. Hizmetleri kaydettikten sonra bir IServiceProvider örneği oluşturmak için BuildServiceProvider yöntemini çağırın. tüm IServiceProvider kayıtlı hizmetler için bir kapsayıcı görevi görür ve hizmetleri çözümlemek için bunu kullanırsınız.
Örnek hizmetler oluşturma
Tüm hizmetler eşit şekilde oluşturulmaz. Bazı hizmetler, hizmet kapsayıcısı her aldığında (geçici) yeni bir örnek gerektirirken, diğerleri istekler arasında (kapsam) veya uygulamanın tüm ömrü boyunca (tekil) paylaşılmalıdır. Hizmet ömrü hakkında daha fazla bilgi için bkz. Hizmet ömrü.
Benzer şekilde, bazı hizmetler yalnızca somut bir türü kullanıma sunarken, diğerleri bir arabirim ile uygulama türü arasında sözleşme olarak ifade edilir. Bu kavramların gösterilmesine yardımcı olmak için çeşitli hizmet varyasyonları oluşturursunuz.
IConsole.cs adlı yeni bir C# dosyası oluşturun ve aşağıdaki kodu ekleyin:
public interface IConsole
{
void WriteLine(string message);
}
Bu dosya, tek bir yöntemi kullanıma sunan bir IConsole arabirim tanımlar. WriteLine Ardından, DefaultConsole.cs adlı yeni bir C# dosyası oluşturun ve aşağıdaki kodu ekleyin:
internal sealed class DefaultConsole : IConsole
{
public bool IsEnabled { get; set; } = true;
void IConsole.WriteLine(string message)
{
if (IsEnabled is false)
{
return;
}
Console.WriteLine(message);
}
}
Yukarıdaki kod, arabirimin varsayılan uygulamasını IConsole temsil eder.
WriteLine yöntemi, IsEnabled özelliğine göre konsola koşullu olarak yazar.
Tavsiye
Bir uygulamanın adlandırılması, geliştirme ekibinizin üzerinde anlaşmaya varması gereken bir seçimdir. Önek Default, bir arabirimin varsayılan uygulamasını gösteren yaygın bir kuraldır, ancak gerekli değildir .
Ardından bir IGreetingService.cs dosyası oluşturun ve aşağıdaki C# kodunu ekleyin:
public interface IGreetingService
{
string Greet(string name);
}
Ardından DefaultGreetingService.cs adlı yeni bir C# dosyası ekleyin ve aşağıdaki kodu ekleyin:
internal sealed class DefaultGreetingService(
IConsole console) : IGreetingService
{
public string Greet(string name)
{
var greeting = $"Hello, {name}!";
console.WriteLine(greeting);
return greeting;
}
}
Yukarıdaki kod, arabirimin varsayılan uygulamasını IGreetingService temsil eder. Hizmet uygulaması birincil oluşturucu parametresi olarak bir IConsole gerektirir.
Greet yöntemi:
- Verilen
greetingöğesiyle birnameoluşturur. -
WriteLineörneğindeIConsolemetodunu çağırır. -
greetingöğesini çağırana döndürür.
sınıfı, DefaultGreetingService devralmayı önlemek için uygulamalara hizmet verebileceğinizi seal ve derlemeye erişimi kısıtlamak için kullanabileceğinizi internal gösterir.
Oluşturulacak son hizmet FarewellService.cs dosyasıdır. Devam etmeden önce aşağıdaki C# kodunu ekleyin:
public class FarewellService(IConsole console)
{
public string SayGoodbye(string name)
{
var farewell = $"Goodbye, {name}!";
console.WriteLine(farewell);
return farewell;
}
}
, FarewellService bir arabirimi değil somut bir türü temsil eder. Tüketicilerin erişimine açmak için bunu olarak public bildirmeniz gerekir. ve internalolarak bildirdiğiniz diğer hizmet uygulama türlerinden farklı olaraksealed, bu kod tüm hizmetlerin arabirim olması gerekmediğini gösterir.
Program sınıfını güncelle
Program.cs dosyasını açın ve var olan kodu aşağıdaki C# koduyla değiştirin:
using Microsoft.Extensions.DependencyInjection;
// 1. Create the service collection.
var services = new ServiceCollection();
// 2. Register (add and configure) the services.
services.AddSingleton<IConsole>(
implementationFactory: static _ => new DefaultConsole
{
IsEnabled = true
});
services.AddSingleton<IGreetingService, DefaultGreetingService>();
services.AddSingleton<FarewellService>();
// 3. Build the service provider from the service collection.
var serviceProvider = services.BuildServiceProvider();
// 4. Resolve the services that you need.
var greetingService = serviceProvider.GetRequiredService<IGreetingService>();
var farewellService = serviceProvider.GetRequiredService<FarewellService>();
// 5. Use the services
var greeting = greetingService.Greet("David");
var farewell = farewellService.SayGoodbye("David");
Yukarıdaki kodda aşağıdakilerin nasıl yapılacağını gösterilmektedir:
- Yeni
ServiceCollectionbir örnek oluşturun. - içinde
ServiceCollectionhizmetleri kaydedin ve yapılandırın:-
IConsolehizmeti uygulama fabrikası aşırı yükleme işlemi kullanılarak.DefaultConsoletürü,IsEnabledözelliğitrueolarak ayarlanmış şekilde döndürülür. - karşılık
IGreetingServicegelen uygulama türüneDefaultGreetingServicesahip hizmet. - Somut bir tür olarak
FarewellServiceservisi.
-
-
ServiceProvideröğesiniServiceCollection'den oluşturun. -
IGreetingServiceveFarewellServicehizmetlerini çözün. - adlı
Davidbir kişiyi selamlayıp veda etmek için çözümlenen hizmetleri kullanın.
Eğer IsEnabled öğesinin DefaultConsole özelliğini false olarak güncelleştirirseniz, Greet ve SayGoodbye yöntemleri sonucunda elde edilen iletileri konsola yazmayı atlar. Bu değişiklik, IConsole hizmetinin, IGreetingService ve FarewellService hizmetlerine uygulamanın davranışını etkileyen bir bağımlılık olarak enjekte edildiğini göstermeye yardımcı olur.
Bu hizmetlerin tümü singleton olarak kaydedilir. Bu örnek için, bunları geçici veya kapsamlı hizmetler olarak kaydederseniz aynı şekilde çalışır.
Önemli
Bu eşleştirilmiş örnekte hizmet ömrü önemli değildir. Gerçek dünyadaki bir uygulamada, her hizmetin ömrünü dikkatle göz önünde bulundurun.
Örnek uygulamayı çalıştırma
Örnek uygulamayı çalıştırmak için Visual Studio veya Visual Studio Code'da F5 tuşuna dotnet run basın veya terminalde komutunu çalıştırın. Uygulama tamamlandığında aşağıdaki çıkışı görürsünüz:
Hello, David!
Goodbye, David!
Hizmet tanımlayıcıları
'a ServiceCollection hizmet eklemek için en yaygın olarak kullanılan API'ler şunlar gibi yaşam boyu adlandırılmış genel uzantı yöntemleridir:
AddSingleton<TService>AddTransient<TService>AddScoped<TService>
Bu yöntemler, bir ServiceDescriptor örneği oluşturan ve onu ServiceCollection'e ekleyen yardımcı yöntemlerdir.
ServiceDescriptor, bir hizmeti hizmet türü, uygulama türü ve yaşam süresiyle açıklayan basit bir sınıftır. Uygulama fabrikalarını ve örneklerini de açıklayabilir.
İçinde ServiceCollection kaydettiğiniz her hizmet için bunun yerine doğrudan bir ServiceDescriptor örneği ile Add yöntemini çağırabilirsiniz. Aşağıdaki örnekleri göz önünde bulundurun:
services.Add(ServiceDescriptor.Describe(
serviceType: typeof(IConsole),
implementationFactory: static _ => new DefaultConsole
{
IsEnabled = true
},
lifetime: ServiceLifetime.Singleton));
Yukarıdaki kod, IConsole içinde hizmetin nasıl ServiceCollection kaydedildiğiyle eşdeğerdir.
Add yöntemi, IConsole hizmetini açıklayan bir ServiceDescriptor örneği ekler. Statik yöntem ServiceDescriptor.Describe, çeşitli ServiceDescriptor oluşturuculara devreder. Hizmet için IGreetingService eşdeğer kodu göz önünde bulundurun:
services.Add(ServiceDescriptor.Describe(
serviceType: typeof(IGreetingService),
implementationType: typeof(DefaultGreetingService),
lifetime: ServiceLifetime.Singleton));
Yukarıdaki kod, hizmeti hizmet türü, uygulama türü ve yaşam süresiyle açıklar IGreetingService . Son olarak, hizmet için FarewellService eşdeğer kodu göz önünde bulundurun:
services.Add(ServiceDescriptor.Describe(
serviceType: typeof(FarewellService),
implementationType: typeof(FarewellService),
lifetime: ServiceLifetime.Singleton));
Yukarıdaki kod, somut FarewellService türü hem hizmet hem de uygulama türleri olarak açıklar. Hizmet tek bir hizmet olarak kaydedilir.