Scrutor 5.0.2

dotnet add package Scrutor --version 5.0.2                
NuGet\Install-Package Scrutor -Version 5.0.2                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Scrutor" Version="5.0.2" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Scrutor --version 5.0.2                
#r "nuget: Scrutor, 5.0.2"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install Scrutor as a Cake Addin
#addin nuget:?package=Scrutor&version=5.0.2

// Install Scrutor as a Cake Tool
#tool nuget:?package=Scrutor&version=5.0.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>();
Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 was computed.  net462 is compatible.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (701)

Showing the top 5 NuGet packages that depend on Scrutor:

Package Downloads
Swashbuckle.AspNetCore.Filters

Some additional useful filters for Swashbuckle.AspNetCore. This package replaces Swashbuckle.AspNetCore.Examples.

Scrutor.AspNetCore

Dependency Injection Helper Package For .Net Core Apps

Sitko.Core.App

Sitko.Core is a set of libraries to help build .NET Core applications fast

Elsa.Core

Elsa is a set of workflow libraries and tools that enable lean and mean workflowing capabilities in any .NET Core application. This package contains the core of Elsa. Tip: reference the `Elsa` package instead of this one.

Elsa

Bundles the most commonly-used packages when building an Elsa workflows application.

GitHub repositories (71)

Showing the top 5 popular GitHub repositories that depend on Scrutor:

Repository Stars
elsa-workflows/elsa-core
A .NET workflows library
RayWangQvQ/BiliBiliToolPro
B 站(bilibili)自动任务工具,支持docker、青龙、k8s等多种部署方式。敏感肌也能用。
EventStore/EventStore
EventStoreDB, the event-native database. Designed for Event Sourcing, Event-Driven, and Microservices architectures
MapsterMapper/Mapster
A fast, fun and stimulating object to object Mapper
ivanpaulovich/clean-architecture-manga
:cyclone: Clean Architecture with .NET6, C#10 and React+Redux. Use cases as central organizing structure, completely testable, decoupled from frameworks
Version Downloads Last updated
5.0.2 624,716 11/7/2024
5.0.1 1,016,332 9/26/2024
5.0.0 52,807 9/25/2024
4.2.2 21,401,485 3/27/2023
4.2.1 2,934,208 2/8/2023
4.2.0 13,881,837 5/31/2022
4.1.0 5,385,860 3/2/2022
4.0.0 1,652,813 1/28/2022
3.3.0 63,700,738 11/3/2020
3.2.2 4,855,139 8/25/2020
3.2.1 5,431,872 4/20/2020
3.2.0 2,176,073 2/6/2020
3.1.0 6,494,781 8/7/2019
3.0.3 22,890 8/7/2019
3.0.2 4,207,177 11/13/2018
3.0.1 20,704,193 8/30/2018
2.2.2 1,619,596 3/12/2018
2.2.1 82,502 3/1/2018
2.2.0 14,103 2/27/2018
2.1.2 342,604 8/28/2017
2.1.1 16,019 8/25/2017
2.1.0 8,866 8/23/2017
2.0.0 444,245 7/12/2017
2.0.0-rc2 7,785 5/1/2017
2.0.0-rc 2,649 4/28/2017
2.0.0-beta 2,311 4/10/2017
1.12.0 26,245 4/10/2017
1.11.0 3,023 4/7/2017
1.10.1 8,372 3/9/2017
1.10.0 179,646 9/12/2016
1.9.1 6,045 9/8/2016
1.9.0 2,646 9/8/2016
1.8.0 7,682 7/14/2016
1.7.0 11,195 5/29/2016
1.6.0 3,327 5/9/2016
1.5.0 2,815 4/22/2016
1.4.0 2,690 4/22/2016
1.3.2 2,721 4/8/2016
1.3.1 3,197 3/7/2016
1.3.0 2,764 2/29/2016
1.2.0 2,644 2/16/2016
1.1.1 3,214 11/25/2015
1.1.0 2,745 11/25/2015
1.0.0 16,162 11/14/2015