|
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System;
using System.Diagnostics.CodeAnalysis;
namespace Microsoft.Extensions.DependencyInjection
{
/// <summary>
/// Extension methods for adding services to an <see cref="IServiceCollection" />.
/// </summary>
public static partial class ServiceCollectionServiceExtensions
{
/// <summary>
/// Adds a transient service of the type specified in <paramref name="serviceType"/> with an
/// implementation of the type specified in <paramref name="implementationType"/> to the
/// specified <see cref="IServiceCollection"/>.
/// </summary>
/// <param name="services">The <see cref="IServiceCollection"/> to add the service to.</param>
/// <param name="serviceType">The type of the service to register.</param>
/// <param name="serviceKey">The <see cref="ServiceDescriptor.ServiceKey"/> of the service.</param>
/// <param name="implementationType">The implementation type of the service.</param>
/// <returns>A reference to this instance after the operation has completed.</returns>
/// <seealso cref="ServiceLifetime.Transient"/>
public static IServiceCollection AddKeyedTransient(
this IServiceCollection services,
Type serviceType,
object? serviceKey,
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type implementationType)
{
ThrowHelper.ThrowIfNull(services);
ThrowHelper.ThrowIfNull(serviceType);
ThrowHelper.ThrowIfNull(implementationType);
return AddKeyed(services, serviceType, serviceKey, implementationType, ServiceLifetime.Transient);
}
/// <summary>
/// Adds a transient service of the type specified in <paramref name="serviceType"/> with a
/// factory specified in <paramref name="implementationFactory"/> to the
/// specified <see cref="IServiceCollection"/>.
/// </summary>
/// <param name="services">The <see cref="IServiceCollection"/> to add the service to.</param>
/// <param name="serviceType">The type of the service to register.</param>
/// <param name="serviceKey">The <see cref="ServiceDescriptor.ServiceKey"/> of the service.</param>
/// <param name="implementationFactory">The factory that creates the service.</param>
/// <returns>A reference to this instance after the operation has completed.</returns>
/// <seealso cref="ServiceLifetime.Transient"/>
public static IServiceCollection AddKeyedTransient(
this IServiceCollection services,
Type serviceType,
object? serviceKey,
Func<IServiceProvider, object?, object> implementationFactory)
{
ThrowHelper.ThrowIfNull(services);
ThrowHelper.ThrowIfNull(serviceType);
ThrowHelper.ThrowIfNull(implementationFactory);
return AddKeyed(services, serviceType, serviceKey, implementationFactory, ServiceLifetime.Transient);
}
/// <summary>
/// Adds a transient service of the type specified in <typeparamref name="TService"/> with an
/// implementation type specified in <typeparamref name="TImplementation"/> to the
/// specified <see cref="IServiceCollection"/>.
/// </summary>
/// <typeparam name="TService">The type of the service to add.</typeparam>
/// <typeparam name="TImplementation">The type of the implementation to use.</typeparam>
/// <param name="services">The <see cref="IServiceCollection"/> to add the service to.</param>
/// <param name="serviceKey">The <see cref="ServiceDescriptor.ServiceKey"/> of the service.</param>
/// <returns>A reference to this instance after the operation has completed.</returns>
/// <seealso cref="ServiceLifetime.Transient"/>
public static IServiceCollection AddKeyedTransient<TService, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TImplementation>(
this IServiceCollection services,
object? serviceKey)
where TService : class
where TImplementation : class, TService
{
ThrowHelper.ThrowIfNull(services);
return services.AddKeyedTransient(typeof(TService), serviceKey, typeof(TImplementation));
}
/// <summary>
/// Adds a transient service of the type specified in <paramref name="serviceType"/> to the
/// specified <see cref="IServiceCollection"/>.
/// </summary>
/// <param name="services">The <see cref="IServiceCollection"/> to add the service to.</param>
/// <param name="serviceType">The type of the service to register and the implementation to use.</param>
/// <param name="serviceKey">The <see cref="ServiceDescriptor.ServiceKey"/> of the service.</param>
/// <returns>A reference to this instance after the operation has completed.</returns>
/// <seealso cref="ServiceLifetime.Transient"/>
public static IServiceCollection AddKeyedTransient(
this IServiceCollection services,
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type serviceType,
object? serviceKey)
{
ThrowHelper.ThrowIfNull(services);
ThrowHelper.ThrowIfNull(serviceType);
return services.AddKeyedTransient(serviceType, serviceKey, serviceType);
}
/// <summary>
/// Adds a transient service of the type specified in <typeparamref name="TService"/> to the
/// specified <see cref="IServiceCollection"/>.
/// </summary>
/// <typeparam name="TService">The type of the service to add.</typeparam>
/// <param name="services">The <see cref="IServiceCollection"/> to add the service to.</param>
/// <param name="serviceKey">The <see cref="ServiceDescriptor.ServiceKey"/> of the service.</param>
/// <returns>A reference to this instance after the operation has completed.</returns>
/// <seealso cref="ServiceLifetime.Transient"/>
public static IServiceCollection AddKeyedTransient<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TService>(
this IServiceCollection services,
object? serviceKey)
where TService : class
{
ThrowHelper.ThrowIfNull(services);
return services.AddKeyedTransient(typeof(TService), serviceKey);
}
/// <summary>
/// Adds a transient service of the type specified in <typeparamref name="TService"/> with a
/// factory specified in <paramref name="implementationFactory"/> to the
/// specified <see cref="IServiceCollection"/>.
/// </summary>
/// <typeparam name="TService">The type of the service to add.</typeparam>
/// <param name="services">The <see cref="IServiceCollection"/> to add the service to.</param>
/// <param name="serviceKey">The <see cref="ServiceDescriptor.ServiceKey"/> of the service.</param>
/// <param name="implementationFactory">The factory that creates the service.</param>
/// <returns>A reference to this instance after the operation has completed.</returns>
/// <seealso cref="ServiceLifetime.Transient"/>
public static IServiceCollection AddKeyedTransient<TService>(
this IServiceCollection services,
object? serviceKey,
Func<IServiceProvider, object?, TService> implementationFactory)
where TService : class
{
ThrowHelper.ThrowIfNull(services);
ThrowHelper.ThrowIfNull(implementationFactory);
return services.AddKeyedTransient(typeof(TService), serviceKey, implementationFactory);
}
/// <summary>
/// Adds a transient service of the type specified in <typeparamref name="TService"/> with an
/// implementation type specified in <typeparamref name="TImplementation" /> using the
/// factory specified in <paramref name="implementationFactory"/> to the
/// specified <see cref="IServiceCollection"/>.
/// </summary>
/// <typeparam name="TService">The type of the service to add.</typeparam>
/// <typeparam name="TImplementation">The type of the implementation to use.</typeparam>
/// <param name="services">The <see cref="IServiceCollection"/> to add the service to.</param>
/// <param name="serviceKey">The <see cref="ServiceDescriptor.ServiceKey"/> of the service.</param>
/// <param name="implementationFactory">The factory that creates the service.</param>
/// <returns>A reference to this instance after the operation has completed.</returns>
/// <seealso cref="ServiceLifetime.Transient"/>
public static IServiceCollection AddKeyedTransient<TService, TImplementation>(
this IServiceCollection services,
object? serviceKey,
Func<IServiceProvider, object?, TImplementation> implementationFactory)
where TService : class
where TImplementation : class, TService
{
ThrowHelper.ThrowIfNull(services);
ThrowHelper.ThrowIfNull(implementationFactory);
return services.AddKeyedTransient(typeof(TService), serviceKey, implementationFactory);
}
/// <summary>
/// Adds a scoped service of the type specified in <paramref name="serviceType"/> with an
/// implementation of the type specified in <paramref name="implementationType"/> to the
/// specified <see cref="IServiceCollection"/>.
/// </summary>
/// <param name="services">The <see cref="IServiceCollection"/> to add the service to.</param>
/// <param name="serviceType">The type of the service to register.</param>
/// <param name="serviceKey">The <see cref="ServiceDescriptor.ServiceKey"/> of the service.</param>
/// <param name="implementationType">The implementation type of the service.</param>
/// <returns>A reference to this instance after the operation has completed.</returns>
/// <seealso cref="ServiceLifetime.Scoped"/>
public static IServiceCollection AddKeyedScoped(
this IServiceCollection services,
Type serviceType,
object? serviceKey,
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type implementationType)
{
ThrowHelper.ThrowIfNull(services);
ThrowHelper.ThrowIfNull(serviceType);
ThrowHelper.ThrowIfNull(implementationType);
return AddKeyed(services, serviceType, serviceKey, implementationType, ServiceLifetime.Scoped);
}
/// <summary>
/// Adds a scoped service of the type specified in <paramref name="serviceType"/> with a
/// factory specified in <paramref name="implementationFactory"/> to the
/// specified <see cref="IServiceCollection"/>.
/// </summary>
/// <param name="services">The <see cref="IServiceCollection"/> to add the service to.</param>
/// <param name="serviceType">The type of the service to register.</param>
/// <param name="serviceKey">The <see cref="ServiceDescriptor.ServiceKey"/> of the service.</param>
/// <param name="implementationFactory">The factory that creates the service.</param>
/// <returns>A reference to this instance after the operation has completed.</returns>
/// <seealso cref="ServiceLifetime.Scoped"/>
public static IServiceCollection AddKeyedScoped(
this IServiceCollection services,
Type serviceType,
object? serviceKey,
Func<IServiceProvider, object?, object> implementationFactory)
{
ThrowHelper.ThrowIfNull(services);
ThrowHelper.ThrowIfNull(serviceType);
ThrowHelper.ThrowIfNull(implementationFactory);
return AddKeyed(services, serviceType, serviceKey, implementationFactory, ServiceLifetime.Scoped);
}
/// <summary>
/// Adds a scoped service of the type specified in <typeparamref name="TService"/> with an
/// implementation type specified in <typeparamref name="TImplementation"/> to the
/// specified <see cref="IServiceCollection"/>.
/// </summary>
/// <typeparam name="TService">The type of the service to add.</typeparam>
/// <typeparam name="TImplementation">The type of the implementation to use.</typeparam>
/// <param name="services">The <see cref="IServiceCollection"/> to add the service to.</param>
/// <param name="serviceKey">The <see cref="ServiceDescriptor.ServiceKey"/> of the service.</param>
/// <returns>A reference to this instance after the operation has completed.</returns>
/// <seealso cref="ServiceLifetime.Scoped"/>
public static IServiceCollection AddKeyedScoped<TService, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TImplementation>(
this IServiceCollection services,
object? serviceKey)
where TService : class
where TImplementation : class, TService
{
ThrowHelper.ThrowIfNull(services);
return services.AddKeyedScoped(typeof(TService), serviceKey, typeof(TImplementation));
}
/// <summary>
/// Adds a scoped service of the type specified in <paramref name="serviceType"/> to the
/// specified <see cref="IServiceCollection"/>.
/// </summary>
/// <param name="services">The <see cref="IServiceCollection"/> to add the service to.</param>
/// <param name="serviceType">The type of the service to register and the implementation to use.</param>
/// <param name="serviceKey">The <see cref="ServiceDescriptor.ServiceKey"/> of the service.</param>
/// <returns>A reference to this instance after the operation has completed.</returns>
/// <seealso cref="ServiceLifetime.Scoped"/>
public static IServiceCollection AddKeyedScoped(
this IServiceCollection services,
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type serviceType,
object? serviceKey)
{
ThrowHelper.ThrowIfNull(services);
ThrowHelper.ThrowIfNull(serviceType);
return services.AddKeyedScoped(serviceType, serviceKey, serviceType);
}
/// <summary>
/// Adds a scoped service of the type specified in <typeparamref name="TService"/> to the
/// specified <see cref="IServiceCollection"/>.
/// </summary>
/// <typeparam name="TService">The type of the service to add.</typeparam>
/// <param name="services">The <see cref="IServiceCollection"/> to add the service to.</param>
/// <param name="serviceKey">The <see cref="ServiceDescriptor.ServiceKey"/> of the service.</param>
/// <returns>A reference to this instance after the operation has completed.</returns>
/// <seealso cref="ServiceLifetime.Scoped"/>
public static IServiceCollection AddKeyedScoped<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TService>(
this IServiceCollection services,
object? serviceKey)
where TService : class
{
ThrowHelper.ThrowIfNull(services);
return services.AddKeyedScoped(typeof(TService), serviceKey);
}
/// <summary>
/// Adds a scoped service of the type specified in <typeparamref name="TService"/> with a
/// factory specified in <paramref name="implementationFactory"/> to the
/// specified <see cref="IServiceCollection"/>.
/// </summary>
/// <typeparam name="TService">The type of the service to add.</typeparam>
/// <param name="services">The <see cref="IServiceCollection"/> to add the service to.</param>
/// <param name="serviceKey">The <see cref="ServiceDescriptor.ServiceKey"/> of the service.</param>
/// <param name="implementationFactory">The factory that creates the service.</param>
/// <returns>A reference to this instance after the operation has completed.</returns>
/// <seealso cref="ServiceLifetime.Scoped"/>
public static IServiceCollection AddKeyedScoped<TService>(
this IServiceCollection services,
object? serviceKey,
Func<IServiceProvider, object?, TService> implementationFactory)
where TService : class
{
ThrowHelper.ThrowIfNull(services);
ThrowHelper.ThrowIfNull(implementationFactory);
return services.AddKeyedScoped(typeof(TService), serviceKey, implementationFactory);
}
/// <summary>
/// Adds a scoped service of the type specified in <typeparamref name="TService"/> with an
/// implementation type specified in <typeparamref name="TImplementation" /> using the
/// factory specified in <paramref name="implementationFactory"/> to the
/// specified <see cref="IServiceCollection"/>.
/// </summary>
/// <typeparam name="TService">The type of the service to add.</typeparam>
/// <typeparam name="TImplementation">The type of the implementation to use.</typeparam>
/// <param name="services">The <see cref="IServiceCollection"/> to add the service to.</param>
/// <param name="serviceKey">The <see cref="ServiceDescriptor.ServiceKey"/> of the service.</param>
/// <param name="implementationFactory">The factory that creates the service.</param>
/// <returns>A reference to this instance after the operation has completed.</returns>
/// <seealso cref="ServiceLifetime.Scoped"/>
public static IServiceCollection AddKeyedScoped<TService, TImplementation>(
this IServiceCollection services,
object? serviceKey,
Func<IServiceProvider, object?, TImplementation> implementationFactory)
where TService : class
where TImplementation : class, TService
{
ThrowHelper.ThrowIfNull(services);
ThrowHelper.ThrowIfNull(implementationFactory);
return services.AddKeyedScoped(typeof(TService), serviceKey, implementationFactory);
}
/// <summary>
/// Adds a singleton service of the type specified in <paramref name="serviceType"/> with an
/// implementation of the type specified in <paramref name="implementationType"/> to the
/// specified <see cref="IServiceCollection"/>.
/// </summary>
/// <param name="services">The <see cref="IServiceCollection"/> to add the service to.</param>
/// <param name="serviceType">The type of the service to register.</param>
/// <param name="serviceKey">The <see cref="ServiceDescriptor.ServiceKey"/> of the service.</param>
/// <param name="implementationType">The implementation type of the service.</param>
/// <returns>A reference to this instance after the operation has completed.</returns>
/// <seealso cref="ServiceLifetime.Singleton"/>
public static IServiceCollection AddKeyedSingleton(
this IServiceCollection services,
Type serviceType,
object? serviceKey,
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type implementationType)
{
ThrowHelper.ThrowIfNull(services);
ThrowHelper.ThrowIfNull(serviceType);
ThrowHelper.ThrowIfNull(implementationType);
return AddKeyed(services, serviceType, serviceKey, implementationType, ServiceLifetime.Singleton);
}
/// <summary>
/// Adds a singleton service of the type specified in <paramref name="serviceType"/> with a
/// factory specified in <paramref name="implementationFactory"/> to the
/// specified <see cref="IServiceCollection"/>.
/// </summary>
/// <param name="services">The <see cref="IServiceCollection"/> to add the service to.</param>
/// <param name="serviceType">The type of the service to register.</param>
/// <param name="serviceKey">The <see cref="ServiceDescriptor.ServiceKey"/> of the service.</param>
/// <param name="implementationFactory">The factory that creates the service.</param>
/// <returns>A reference to this instance after the operation has completed.</returns>
/// <seealso cref="ServiceLifetime.Singleton"/>
public static IServiceCollection AddKeyedSingleton(
this IServiceCollection services,
Type serviceType,
object? serviceKey,
Func<IServiceProvider, object?, object> implementationFactory)
{
ThrowHelper.ThrowIfNull(services);
ThrowHelper.ThrowIfNull(serviceType);
ThrowHelper.ThrowIfNull(implementationFactory);
return AddKeyed(services, serviceType, serviceKey, implementationFactory, ServiceLifetime.Singleton);
}
/// <summary>
/// Adds a singleton service of the type specified in <typeparamref name="TService"/> with an
/// implementation type specified in <typeparamref name="TImplementation"/> to the
/// specified <see cref="IServiceCollection"/>.
/// </summary>
/// <typeparam name="TService">The type of the service to add.</typeparam>
/// <typeparam name="TImplementation">The type of the implementation to use.</typeparam>
/// <param name="services">The <see cref="IServiceCollection"/> to add the service to.</param>
/// <param name="serviceKey">The <see cref="ServiceDescriptor.ServiceKey"/> of the service.</param>
/// <returns>A reference to this instance after the operation has completed.</returns>
/// <seealso cref="ServiceLifetime.Singleton"/>
public static IServiceCollection AddKeyedSingleton<TService, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TImplementation>(
this IServiceCollection services,
object? serviceKey)
where TService : class
where TImplementation : class, TService
{
ThrowHelper.ThrowIfNull(services);
return services.AddKeyedSingleton(typeof(TService), serviceKey, typeof(TImplementation));
}
/// <summary>
/// Adds a singleton service of the type specified in <paramref name="serviceType"/> to the
/// specified <see cref="IServiceCollection"/>.
/// </summary>
/// <param name="services">The <see cref="IServiceCollection"/> to add the service to.</param>
/// <param name="serviceType">The type of the service to register and the implementation to use.</param>
/// <param name="serviceKey">The <see cref="ServiceDescriptor.ServiceKey"/> of the service.</param>
/// <returns>A reference to this instance after the operation has completed.</returns>
/// <seealso cref="ServiceLifetime.Singleton"/>
public static IServiceCollection AddKeyedSingleton(
this IServiceCollection services,
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type serviceType,
object? serviceKey)
{
ThrowHelper.ThrowIfNull(services);
ThrowHelper.ThrowIfNull(serviceType);
return services.AddKeyedSingleton(serviceType, serviceKey, serviceType);
}
/// <summary>
/// Adds a singleton service of the type specified in <typeparamref name="TService"/> to the
/// specified <see cref="IServiceCollection"/>.
/// </summary>
/// <typeparam name="TService">The type of the service to add.</typeparam>
/// <param name="services">The <see cref="IServiceCollection"/> to add the service to.</param>
/// <param name="serviceKey">The <see cref="ServiceDescriptor.ServiceKey"/> of the service.</param>
/// <returns>A reference to this instance after the operation has completed.</returns>
/// <seealso cref="ServiceLifetime.Singleton"/>
public static IServiceCollection AddKeyedSingleton<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TService>(
this IServiceCollection services,
object? serviceKey)
where TService : class
{
ThrowHelper.ThrowIfNull(services);
return services.AddKeyedSingleton(typeof(TService), serviceKey, typeof(TService));
}
/// <summary>
/// Adds a singleton service of the type specified in <typeparamref name="TService"/> with a
/// factory specified in <paramref name="implementationFactory"/> to the
/// specified <see cref="IServiceCollection"/>.
/// </summary>
/// <typeparam name="TService">The type of the service to add.</typeparam>
/// <param name="services">The <see cref="IServiceCollection"/> to add the service to.</param>
/// <param name="serviceKey">The <see cref="ServiceDescriptor.ServiceKey"/> of the service.</param>
/// <param name="implementationFactory">The factory that creates the service.</param>
/// <returns>A reference to this instance after the operation has completed.</returns>
/// <seealso cref="ServiceLifetime.Singleton"/>
public static IServiceCollection AddKeyedSingleton<TService>(
this IServiceCollection services,
object? serviceKey,
Func<IServiceProvider, object?, TService> implementationFactory)
where TService : class
{
ThrowHelper.ThrowIfNull(services);
ThrowHelper.ThrowIfNull(implementationFactory);
return services.AddKeyedSingleton(typeof(TService), serviceKey, implementationFactory);
}
/// <summary>
/// Adds a singleton service of the type specified in <typeparamref name="TService"/> with an
/// implementation type specified in <typeparamref name="TImplementation" /> using the
/// factory specified in <paramref name="implementationFactory"/> to the
/// specified <see cref="IServiceCollection"/>.
/// </summary>
/// <typeparam name="TService">The type of the service to add.</typeparam>
/// <typeparam name="TImplementation">The type of the implementation to use.</typeparam>
/// <param name="services">The <see cref="IServiceCollection"/> to add the service to.</param>
/// <param name="serviceKey">The <see cref="ServiceDescriptor.ServiceKey"/> of the service.</param>
/// <param name="implementationFactory">The factory that creates the service.</param>
/// <returns>A reference to this instance after the operation has completed.</returns>
/// <seealso cref="ServiceLifetime.Singleton"/>
public static IServiceCollection AddKeyedSingleton<TService, TImplementation>(
this IServiceCollection services,
object? serviceKey,
Func<IServiceProvider, object?, TImplementation> implementationFactory)
where TService : class
where TImplementation : class, TService
{
ThrowHelper.ThrowIfNull(services);
ThrowHelper.ThrowIfNull(implementationFactory);
return services.AddKeyedSingleton(typeof(TService), serviceKey, implementationFactory);
}
/// <summary>
/// Adds a singleton service of the type specified in <paramref name="serviceType"/> with an
/// instance specified in <paramref name="implementationInstance"/> to the
/// specified <see cref="IServiceCollection"/>.
/// </summary>
/// <param name="services">The <see cref="IServiceCollection"/> to add the service to.</param>
/// <param name="serviceType">The type of the service to register.</param>
/// <param name="serviceKey">The <see cref="ServiceDescriptor.ServiceKey"/> of the service.</param>
/// <param name="implementationInstance">The instance of the service.</param>
/// <returns>A reference to this instance after the operation has completed.</returns>
/// <seealso cref="ServiceLifetime.Singleton"/>
public static IServiceCollection AddKeyedSingleton(
this IServiceCollection services,
Type serviceType,
object? serviceKey,
object implementationInstance)
{
ThrowHelper.ThrowIfNull(services);
ThrowHelper.ThrowIfNull(serviceType);
ThrowHelper.ThrowIfNull(implementationInstance);
var serviceDescriptor = new ServiceDescriptor(serviceType, serviceKey, implementationInstance);
services.Add(serviceDescriptor);
return services;
}
/// <summary>
/// Adds a singleton service of the type specified in <typeparamref name="TService" /> with an
/// instance specified in <paramref name="implementationInstance"/> to the
/// specified <see cref="IServiceCollection"/>.
/// </summary>
/// <param name="services">The <see cref="IServiceCollection"/> to add the service to.</param>
/// <param name="serviceKey">The <see cref="ServiceDescriptor.ServiceKey"/> of the service.</param>
/// <param name="implementationInstance">The instance of the service.</param>
/// <returns>A reference to this instance after the operation has completed.</returns>
/// <seealso cref="ServiceLifetime.Singleton"/>
public static IServiceCollection AddKeyedSingleton<TService>(
this IServiceCollection services,
object? serviceKey,
TService implementationInstance)
where TService : class
{
ThrowHelper.ThrowIfNull(services);
ThrowHelper.ThrowIfNull(implementationInstance);
return services.AddKeyedSingleton(typeof(TService), serviceKey, implementationInstance);
}
private static IServiceCollection AddKeyed(
IServiceCollection collection,
Type serviceType,
object? serviceKey,
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type implementationType,
ServiceLifetime lifetime)
{
var descriptor = new ServiceDescriptor(serviceType, serviceKey, implementationType, lifetime);
collection.Add(descriptor);
return collection;
}
private static IServiceCollection AddKeyed(
IServiceCollection collection,
Type serviceType,
object? serviceKey,
Func<IServiceProvider, object?, object> implementationFactory,
ServiceLifetime lifetime)
{
var descriptor = new ServiceDescriptor(serviceType, serviceKey, implementationFactory, lifetime);
collection.Add(descriptor);
return collection;
}
}
}
|