Table of Contents

ServiceCollectionExtensions Class

Definition

Namespace
Cuemon.Extensions.DependencyInjection
Assemblies
Cuemon.Extensions.DependencyInjection.dll
Source
src/Cuemon.Extensions.DependencyInjection/ServiceCollectionExtensions.cs

Extension methods for the IServiceCollection interface.

public static class ServiceCollectionExtensions
Inheritance
ServiceCollectionExtensions

Examples

ServiceCollectionExtensions provides registration methods for IServiceCollection that support multi-contract resolution, typed options, and bulk post-configuration. This example defines an OrdersMessageHandler implementing both IMessageHandler<OrdersChannel> and IDependencyInjectionMarker<OrdersChannel>, then registers it with various lifecycle options using Add, TryAdd, and TryConfigure overloads including scoped and singleton lifetimes. It also demonstrates PostConfigureAllOf<HandlerOptions> for bulk configuration of options instances. After building the service provider and creating a scope, the concrete handler, typed contract, and marker are resolved and compared by reference. Console output confirms that all three resolve to the same instance and that HandlerOptions.Label is correctly set to "post-configured".

using System;
using Cuemon.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;

namespace Cuemon.Docs.Samples.DependencyInjection
{
    public static class ServiceCollectionExtensionsExample
    {
        public static void Demonstrate()
        {
            var services = new ServiceCollection();

            services.Add<OrdersMessageHandler>(options =>
            {
                options.Lifetime = ServiceLifetime.Scoped;
            });
            services.TryAdd<OrdersMessageHandler>(options =>
            {
                options.Lifetime = ServiceLifetime.Scoped;
            });
            services.TryAdd<IMessageHandler<OrdersChannel>, OrdersMessageHandler>(options =>
            {
                options.Lifetime = ServiceLifetime.Singleton;
            });
            services.TryAdd(typeof(IMessageHandler<OrdersChannel>), typeof(OrdersMessageHandler), options =>
            {
                options.Lifetime = ServiceLifetime.Singleton;
            });
            services.TryAdd<HandlerOptions>(typeof(IMessageHandler<OrdersChannel>), typeof(OrdersMessageHandler), ServiceLifetime.Scoped, options =>
            {
                options.Label = "typed";
            });
            services.TryAdd<IMessageHandler<OrdersChannel>, OrdersMessageHandler, HandlerOptions>(ServiceLifetime.Scoped, options =>
            {
                options.Enabled = true;
            });
            services.TryConfigure<HandlerOptions>(options =>
            {
                options.Label = "configured";
            });
            services.PostConfigureAllOf<HandlerOptions>(options =>
            {
                options.Label = "post-configured";
            });

            using var provider = services.BuildServiceProvider();
            using var scope = provider.CreateScope();

            var concrete = scope.ServiceProvider.GetRequiredService<OrdersMessageHandler>();
            var typedContract = scope.ServiceProvider.GetRequiredService<IMessageHandler<OrdersChannel>>();
            var marker = scope.ServiceProvider.GetRequiredService<IDependencyInjectionMarker<OrdersChannel>>();
            var handlerOptions = scope.ServiceProvider.GetRequiredService<IOptions<HandlerOptions>>().Value;

            Console.WriteLine(object.ReferenceEquals(concrete, typedContract));
            Console.WriteLine(object.ReferenceEquals(concrete, marker));
            Console.WriteLine(typedContract.Name);
            Console.WriteLine(handlerOptions.Label);
        }

        public sealed class OrdersChannel
        {
        }

        public interface IMessageHandler
        {
            string Name { get; }
        }

        public interface IMessageHandler<TChannel> : IMessageHandler, IDependencyInjectionMarker<TChannel>
        {
        }

        public sealed class HandlerOptions
        {
            public bool Enabled { get; set; }

            public string Label { get; set; } = string.Empty;
        }

        public sealed class OrdersMessageHandler : IMessageHandler<OrdersChannel>
        {
            public string Name => nameof(OrdersMessageHandler);
        }
    }
}

Methods

Name Description
Add(IServiceCollection, Type, Func<IServiceProvider, object>, ServiceLifetime)

Adds the specified service with the implementationFactory and lifetime to the services.

Add(IServiceCollection, Type, Func<IServiceProvider, object>, Action<TypeForwardServiceOptions>)

Adds the specified service with the implementationFactory and configured setup to the services.

Add(IServiceCollection, Type, Type, ServiceLifetime)

Adds the specified service with the implementation and lifetime to the services.

Add(IServiceCollection, Type, Type, Action<TypeForwardServiceOptions>)

Adds the specified service with the implementation and configured setup to the services.

Add<TService>(IServiceCollection, Action<TypeForwardServiceOptions>)

Adds the specified TService with the configured setup to the services.

Add<TService>(IServiceCollection, Func<IServiceProvider, TService>, Action<TypeForwardServiceOptions>)

Adds the specified TService with the configured setup to the services.

Add<TOptions>(IServiceCollection, Type, Func<IServiceProvider, object>, ServiceLifetime, Action<TOptions>)

Adds the specified service with the implementationFactory and lifetime to the services.

Add<TOptions>(IServiceCollection, Type, Type, ServiceLifetime, Action<TOptions>)

Adds the specified service with the implementation and lifetime to the services.

Add<TService, TImplementation>(IServiceCollection, ServiceLifetime)

Adds the specified TService with the TImplementation and lifetime to the services.

Add<TService, TImplementation>(IServiceCollection, Action<TypeForwardServiceOptions>)

Adds the specified TService with the TImplementation and configured setup to the services.

Add<TService, TImplementation>(IServiceCollection, Func<IServiceProvider, TImplementation>, ServiceLifetime)

Adds the specified TService with the TImplementation and lifetime to the services.

Add<TService, TImplementation>(IServiceCollection, Func<IServiceProvider, TImplementation>, Action<TypeForwardServiceOptions>)

Adds the specified TService with the TImplementation and configured setup to the services.

Add<TService, TImplementation, TOptions>(IServiceCollection, ServiceLifetime, Action<TOptions>)

Adds the specified TService with the TImplementation and lifetime to the services.

Add<TService, TImplementation, TOptions>(IServiceCollection, Func<IServiceProvider, TImplementation>, ServiceLifetime, Action<TOptions>)

Adds the specified TService with the TImplementation and lifetime to the services.

PostConfigureAllOf<TOptions>(IServiceCollection, Action<TOptions>)

Registers an action used to post-configure all instances of a specific TOptions type in the services collection. These are run after Configure<TOptions>(IServiceCollection, Action<TOptions>).

TryAdd(IServiceCollection, Type, Func<IServiceProvider, object>, ServiceLifetime)

Adds the specified service with the implementationFactory and lifetime to the services if the service type has not already been registered.

TryAdd(IServiceCollection, Type, Func<IServiceProvider, object>, Action<TypeForwardServiceOptions>)

Adds the specified service with the implementationFactory and configured setup to the services if the service type has not already been registered.

TryAdd(IServiceCollection, Type, Type, ServiceLifetime)

Adds the specified service with the implementation and lifetime to the services if the service type has not already been registered.

TryAdd(IServiceCollection, Type, Type, Action<TypeForwardServiceOptions>)

Adds the specified service with the implementation and configured setup to the services if the service type has not already been registered.

TryAdd<TService>(IServiceCollection, Action<TypeForwardServiceOptions>)

Adds the specified TService with the configured setup to the services if the service type has not already been registered.

TryAdd<TService>(IServiceCollection, Func<IServiceProvider, TService>, Action<TypeForwardServiceOptions>)

Adds the specified TService with the configured setup to the services if the service type has not already been registered.

TryAdd<TOptions>(IServiceCollection, Type, Func<IServiceProvider, object>, ServiceLifetime, Action<TOptions>)

Adds the specified service with the implementationFactory and lifetime to the services if the service type has not already been registered.

TryAdd<TOptions>(IServiceCollection, Type, Type, ServiceLifetime, Action<TOptions>)

Adds the specified service with the implementation and lifetime to the services if the service type has not already been registered.

TryAdd<TService, TImplementation>(IServiceCollection, ServiceLifetime)

Adds the specified TService with the TImplementation and lifetime to the services if the service type has not already been registered.

TryAdd<TService, TImplementation>(IServiceCollection, Action<TypeForwardServiceOptions>)

Adds the specified TService with the TImplementation and configured setup to the services if the service type has not already been registered.

TryAdd<TService, TImplementation>(IServiceCollection, Func<IServiceProvider, TImplementation>, ServiceLifetime)

Adds the specified TService with the TImplementation and lifetime to the services if the service type has not already been registered.

TryAdd<TService, TImplementation>(IServiceCollection, Func<IServiceProvider, TImplementation>, Action<TypeForwardServiceOptions>)

Adds the specified TService with the TImplementation and configured setup to the services if the service type has not already been registered.

TryAdd<TService, TImplementation, TOptions>(IServiceCollection, ServiceLifetime, Action<TOptions>)

Adds the specified TService with the TImplementation and lifetime to the services if the service type has not already been registered.

TryAdd<TService, TImplementation, TOptions>(IServiceCollection, Func<IServiceProvider, TImplementation>, ServiceLifetime, Action<TOptions>)

Adds the specified TService with the TImplementation and lifetime to the services if the service type has not already been registered.

TryConfigure<TOptions>(IServiceCollection, Action<TOptions>)

Registers the specified setup used to configure TOptions to the services if not already registered.