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 makalede hizmet gruplarının ve çerçeve tarafından sağlanan hizmetlerin kaydedilmesi ele alınmaktadır. .NET'in sağladığı hizmet kaydı uzantısı yöntemleri hakkında da ayrıntılar sağlar.
Uzantı yöntemleriyle hizmet gruplarını kaydetme
.NET, bir grup ilgili hizmeti kaydetmek için bir kural kullanır. Kural, bir çerçeve özelliğinin gerektirdiği tüm hizmetleri kaydetmek için tek Add{GROUP_NAME} bir uzantı yöntemi kullanmaktır. Örneğin, AddOptions uzantı yöntemi seçenekleri kullanmak için gereken tüm hizmetleri kaydeder.
Çerçeve tarafından sağlanan hizmetler
Kullanılabilir konak veya uygulama oluşturucu desenlerinden herhangi birini kullanırken varsayılanlar uygulanır ve hizmetler çerçeve tarafından kaydedilir. En popüler hosting ve uygulama geliştirici kalıplarından bazılarını göz önünde bulundurun.
- Host.CreateDefaultBuilder()
- Host.CreateApplicationBuilder()
- WebHost.CreateDefaultBuilder()
- WebApplication.CreateBuilder()
- WebAssemblyHostBuilder.CreateDefault
- MauiApp.CreateBuilder
Bu API'lerden herhangi birinden bir oluşturucu oluşturduktan sonra, IServiceCollection konak yapılandırmanıza bağlı olarak çerçeve tarafından tanımlanan hizmetler sunar. .NET şablonlarını temel alan uygulamalar için çerçeve yüzlerce hizmeti kaydedebilir.
Aşağıdaki tabloda bu çerçeveye kayıtlı hizmetlerin küçük bir örneği listelenmektedir:
| Hizmet türü | Ömür |
|---|---|
| Microsoft.Extensions.DependencyInjection.IServiceScopeFactory | Singleton |
| IHostApplicationLifetime | Singleton |
| Microsoft.Extensions.Logging.ILogger<TCategoryName> | Singleton |
| Microsoft.Extensions.Logging.ILoggerFactory | Singleton |
| Microsoft.Extensions.ObjectPool.ObjectPoolProvider | Singleton |
| Microsoft.Extensions.Options.IConfigureOptions<TOptions> | Transient |
| Microsoft.Extensions.Options.IOptions<TOptions> | Singleton |
| System.Diagnostics.DiagnosticListener | Singleton |
| System.Diagnostics.DiagnosticSource | Singleton |
Kayıt yöntemleri
Çerçeve, belirli senaryolarda yararlı olan hizmet kaydı uzantısı yöntemleri sağlar:
| Yöntem | Otomatik nesne yok etme | Birden çok uygulama | Geçiş args |
|---|---|---|---|
Add{LIFETIME}<{SERVICE}, {IMPLEMENTATION}>()Örnek: services.AddSingleton<IMyDep, MyDep>(); |
Yes | Yes | Hayı |
Add{LIFETIME}<{SERVICE}>(sp => new {IMPLEMENTATION})Examples: services.AddSingleton<IMyDep>(sp => new MyDep());services.AddSingleton<IMyDep>(sp => new MyDep(99)); |
Yes | Yes | Yes |
Add{LIFETIME}<{IMPLEMENTATION}>()Örnek: services.AddSingleton<MyDep>(); |
Yes | Hayı | Hayı |
AddSingleton<{SERVICE}>(new {IMPLEMENTATION})Examples: services.AddSingleton<IMyDep>(new MyDep());services.AddSingleton<IMyDep>(new MyDep(99)); |
Hayı | Yes | Yes |
AddSingleton(new {IMPLEMENTATION})Examples: services.AddSingleton(new MyDep());services.AddSingleton(new MyDep(99)); |
Hayı | Hayı | Yes |
Tür elden çıkarma hakkında daha fazla bilgi için Hizmetlerin elden çıkarılması'na bakın.
Bir hizmeti yalnızca uygulama türüyle kaydetmek, bu hizmeti aynı uygulama ve hizmet türüyle kaydetmekle eşdeğerdir. Örneğin, aşağıdaki kodu göz önünde bulundurun:
services.AddSingleton<ExampleService>();
Bu, hizmeti hem hizmete hem de aynı türlerdeki uygulamalara kaydetmeye eşdeğerdir:
services.AddSingleton<ExampleService, ExampleService>();
Bu denklik, bir hizmetin birden çok uygulamasının açık bir hizmet türü almayan yöntemler kullanılarak kaydedilememe nedenidir. Bu yöntemler bir hizmetin birden çok örneğini kaydedebilir, ancak tümü aynı uygulama türüne sahiptir.
Hizmet kayıt yöntemlerinden herhangi biri, aynı hizmet türündeki birden çok hizmet örneğini kaydetmek için kullanılabilir. Aşağıdaki örnekte, AddSingleton hizmet türü olarak ile IMessageWriter iki kez çağrılır. İkinci çağrısı olarak AddSingleton çözümlendiğinde öncekini IMessageWriter geçersiz kılar ve birden çok hizmet aracılığıyla IEnumerable<IMessageWriter>çözümlendiğinde öncekine ekler. Hizmetler, aracılığıyla IEnumerable<{SERVICE}>çözümlendiğinde kaydedildikleri sırayla görünür.
using ConsoleDI.IEnumerableExample;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);
builder.Services.AddSingleton<IMessageWriter, ConsoleMessageWriter>();
builder.Services.AddSingleton<IMessageWriter, LoggingMessageWriter>();
builder.Services.AddSingleton<ExampleService>();
using IHost host = builder.Build();
_ = host.Services.GetService<ExampleService>();
await host.RunAsync();
Yukarıdaki örnek kaynak kodu, öğesinin IMessageWriteriki uygulamasını kaydeder.
using System.Diagnostics;
namespace ConsoleDI.IEnumerableExample;
public sealed class ExampleService
{
public ExampleService(
IMessageWriter messageWriter,
IEnumerable<IMessageWriter> messageWriters)
{
Trace.Assert(messageWriter is LoggingMessageWriter);
var dependencyArray = messageWriters.ToArray();
Trace.Assert(dependencyArray[0] is ConsoleMessageWriter);
Trace.Assert(dependencyArray[1] is LoggingMessageWriter);
}
}
iki ExampleService oluşturucu parametresi tanımlar: tek IMessageWriterbir ve bir IEnumerable<IMessageWriter>. Tek IMessageWriter , kaydedilecek son uygulamadır, ancak IEnumerable<IMessageWriter> tüm kayıtlı uygulamaları temsil eder.
Çerçeve ayrıca, yalnızca henüz kayıtlı bir uygulama yoksa hizmeti kaydeden uzantı yöntemleri sağlar TryAdd{LIFETIME} .
Aşağıdaki örnekte, çağrısı AddSingleton için ConsoleMessageWriterbir uygulama olarak kaydederIMessageWriter. zaten kayıtlı bir uygulamaya sahip olduğundan TryAddSingleton çağrısının IMessageWriter hiçbir etkisi yoktur:
services.AddSingleton<IMessageWriter, ConsoleMessageWriter>();
services.TryAddSingleton<IMessageWriter, LoggingMessageWriter>();
TryAddSingleton zaten eklendiğinden ve "try" başarısız olduğundan hiçbir etkisi yoktur.
ExampleService aşağıdakini doğrular:
public class ExampleService
{
public ExampleService(
IMessageWriter messageWriter,
IEnumerable<IMessageWriter> messageWriters)
{
Trace.Assert(messageWriter is ConsoleMessageWriter);
Trace.Assert(messageWriters.Single() is ConsoleMessageWriter);
}
}
Daha fazla bilgi için bakınız:
TryAddEnumerable(ServiceDescriptor) yöntemleri, hizmeti yalnızca aynı türde bir uygulama yoksa kaydeder. Birden çok hizmet aracılığıyla IEnumerable<{SERVICE}>çözümlenir. Hizmetleri kaydederken, aynı türlerden biri henüz eklenmediyse bir örnek ekleyin. Kitaplık yazarları, bir uygulamanın birden çok kopyasını kapsayıcıya kaydetmekten kaçınmak için kullanır TryAddEnumerable .
Aşağıdaki örnekte, için bir uygulama TryAddEnumerableolarak kaydetmeye MessageWriter yönelik ilk çağrı.IMessageWriter1 İkinci çağrı için MessageWriterkaydolrIMessageWriter2. Üçüncü çağrının hiçbir etkisi yoktur çünkü IMessageWriter1 zaten kayıtlı bir uygulaması vardır MessageWriter:
public interface IMessageWriter1 { }
public interface IMessageWriter2 { }
public class MessageWriter : IMessageWriter1, IMessageWriter2
{
}
services.TryAddEnumerable(ServiceDescriptor.Singleton<IMessageWriter1, MessageWriter>());
services.TryAddEnumerable(ServiceDescriptor.Singleton<IMessageWriter2, MessageWriter>());
services.TryAddEnumerable(ServiceDescriptor.Singleton<IMessageWriter1, MessageWriter>());
Hizmet kaydı, aynı türdeki birden çok uygulamayı kaydetme dışında sipariş bağımsızdır.
IServiceCollection bir nesne koleksiyonudur ServiceDescriptor . Aşağıdaki örnekte, oluşturup ekleyerek bir hizmetin nasıl kaydedildiği gösterilmektedir ServiceDescriptor:
string secretKey = Configuration["SecretKey"];
var descriptor = new ServiceDescriptor(
typeof(IMessageWriter),
_ => new DefaultMessageWriter(secretKey),
ServiceLifetime.Transient);
services.Add(descriptor);
Yerleşik Add{LIFETIME} yöntemler aynı yaklaşımı kullanır. Örneğin, addScoped kaynak koduna bakın.