Scrutor 5.1.2

Scrutor Build status NuGet Package

Scrutor - I search or examine thoroughly; I probe, investigate or scrutinize
From scrūta, as the original sense of the verb was to search through trash. - https://en.wiktionary.org/wiki/scrutor

Assembly scanning and decoration extensions for Microsoft.Extensions.DependencyInjection

Installation

Install the Scrutor NuGet Package.

Package Manager Console

Install-Package Scrutor

.NET Core CLI

dotnet add package Scrutor

Usage

The library adds two extension methods to IServiceCollection:

  • Scan - This is the entry point to set up your assembly scanning.
  • Decorate - This method is used to decorate already registered services.

See Examples below for usage examples.

Examples

Scanning

var collection = new ServiceCollection();

collection.Scan(scan => scan
     // We start out with all types in the assembly of ITransientService
    .FromAssemblyOf<ITransientService>()
        // AddClasses starts out with all public, non-abstract types in this assembly.
        // These types are then filtered by the delegate passed to the method.
        // In this case, we filter out only the classes that are assignable to ITransientService.
        .AddClasses(classes => classes.AssignableTo<ITransientService>())
            // We then specify what type we want to register these classes as.
            // In this case, we want to register the types as all of its implemented interfaces.
            // So if a type implements 3 interfaces; A, B, C, we'd end up with three separate registrations.
            .AsImplementedInterfaces()
            // And lastly, we specify the lifetime of these registrations.
            .WithTransientLifetime()
        // Here we start again, with a new full set of classes from the assembly above.
        // This time, filtering out only the classes assignable to IScopedService.
        .AddClasses(classes => classes.AssignableTo<IScopedService>())
            // Now, we just want to register these types as a single interface, IScopedService.
            .As<IScopedService>()
            // And again, just specify the lifetime.
            .WithScopedLifetime()
        // Generic interfaces are also supported too, e.g. public interface IOpenGeneric<T> 
        .AddClasses(classes => classes.AssignableTo(typeof(IOpenGeneric<>)))
            .AsImplementedInterfaces()
        // And you scan generics with multiple type parameters too
        // e.g. public interface IQueryHandler<TQuery, TResult>
        .AddClasses(classes => classes.AssignableTo(typeof(IQueryHandler<,>)))
            .AsImplementedInterfaces());

Decoration

var collection = new ServiceCollection();

// First, add our service to the collection.
collection.AddSingleton<IDecoratedService, Decorated>();

// Then, decorate Decorated with the Decorator type.
collection.Decorate<IDecoratedService, Decorator>();

// Finally, decorate Decorator with the OtherDecorator type.
// As you can see, OtherDecorator requires a separate service, IService. We can get that from the provider argument.
collection.Decorate<IDecoratedService>((inner, provider) => new OtherDecorator(inner, provider.GetRequiredService<IService>()));

var serviceProvider = collection.BuildServiceProvider();

// When we resolve the IDecoratedService service, we'll get the following structure:
// OtherDecorator -> Decorator -> Decorated
var instance = serviceProvider.GetRequiredService<IDecoratedService>();

Showing the top 20 packages that depend on Scrutor.

Packages Downloads
Elsa.Workflows.Management
Provides workflow management functionality.
8
Elsa
Bundles the most commonly-used packages when building an Elsa workflows application.
7
Elsa.Workflows.Management
Provides workflow management functionality.
7
Elsa
Bundles the most commonly-used packages when building an Elsa workflows application.
6
Swashbuckle.AspNetCore.Filters
Some additional useful filters for Swashbuckle.AspNetCore. This package replaces Swashbuckle.AspNetCore.Examples.
5
Elsa
Bundles the most commonly-used packages when building an Elsa workflows application.
5
Elsa.Workflows.Management
Provides workflow management functionality.
5
Elsa.Workflows.Runtime
Provides workflow runtime functionality.
4
Elsa
Bundles the most commonly-used packages when building an Elsa workflows application.
4
Elsa.Caching
Provides caching services and utility functions common to Elsa modules.
4
Swashbuckle.AspNetCore.Filters
Some additional useful filters for Swashbuckle.AspNetCore. This package replaces Swashbuckle.AspNetCore.Examples.
3
Elsa
Bundles the most commonly-used packages when building an Elsa workflows application.
3
Elsa.Workflows.Management
Provides workflow management functionality.
3

Version Downloads Last updated
6.1.0 3 2025/6/10
6.0.1 2 2025/5/29
6.0.0 2 2025/5/28
5.1.2 1 2025/6/10
5.0.3 1 2025/6/10
5.0.2 1 2025/6/10
5.0.1 1 2025/6/10
5.0.0 1 2025/6/10
4.2.2 1 2025/6/9
4.2.1 3 2025/5/24
4.2.0 1 2025/6/10
4.1.0 1 2025/6/9
4.0.0 1 2025/6/10
3.3.0 1 2025/6/10
3.2.2 1 2025/6/9
3.2.1 1 2025/6/9
3.2.0 1 2025/6/10
3.1.0 1 2025/6/10
3.0.3 1 2025/6/10
3.0.2 1 2025/6/10
3.0.1 1 2025/6/10
2.2.2 1 2025/6/9
2.2.1 1 2025/6/9
2.2.0 1 2025/6/10
2.1.2 2 2025/5/25
2.1.1 1 2025/6/9
2.1.0 1 2025/6/10
2.0.0 1 2025/6/10
2.0.0-rc2 1 2025/6/9
2.0.0-rc 2 2025/5/24
2.0.0-beta 1 2025/6/9
1.12.0 1 2025/6/10
1.11.0 1 2025/6/9
1.10.1 1 2025/6/10
1.10.0 1 2025/6/10
1.9.1 1 2025/6/10
1.9.0 2 2025/5/25
1.8.0 1 2025/6/10
1.7.0 1 2025/6/10
1.6.0 1 2025/6/10
1.5.0 1 2025/6/10
1.4.0 1 2025/6/10
1.3.2 1 2025/6/9
1.3.1 1 2025/6/9
1.3.0 1 2025/6/10
1.2.0 1 2025/6/10
1.1.1 2 2025/5/25
1.1.0 1 2025/6/9
1.0.0 1 2025/6/10