Przejdź do treści

Autorejestracja zależności w .NET Core

  • przez

Na pewno znasz standardowy sposób rejestracji zależności w .net core

services.AddTransient<IWeatherForecastService, WeatherForecastService>();
services.AddScoped<IWeatherForecastService, WeatherForecastService>();
services.AddSingleton<IWeatherForecastService, WeatherForecastService>();

Nie będę zanudzał o różnicach pomiędzy nimi i nie o tym jest ten post. Jeśli pracowałeś z jakimś dużym projektem to wiesz, że strasznie „puchnie” dodawanie kolejnych zależności. Można sobie z tym poradzić poprzez extensions methods, zwykłe metody i pewnie jakieś jeszcze inne sposoby. Ostatnio znalazłem Scrutor i chciałbym pokazać jak można zrobić to prościej.

Zamiast rejestrować każdą implementację po kolei możemy to zrobić na przykład tak:

services.Scan(scan =>
                scan
                    .FromAssemblyDependencies(Assembly.GetExecutingAssembly())
                    .AddClasses(classes => classes.Where(x => x.Name.EndsWith("Service")))
                    .AsImplementedInterfaces()
                    .WithSingletonLifetime());
services.Scan(scan =>
                scan
                    .FromAssemblyDependencies(Assembly.GetExecutingAssembly())
                    .AddClasses(classes => classes.Where(x => x.Name.EndsWith("Repository")))
                    .AsImplementedInterfaces()
                    .WithSingletonLifetime());        

Jak widzisz biblioteka jest bardzo elastyczna i można to zrobić sprytniej (np. dodać osobne interfejsy na Transient, Singleton i Scoped tak jak autor tego posta).