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).