это главное в DI регистрация проводится в месте где запускается всё приложение это либо класс Program в методе Main или класс App в методе

например в WPF

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        // тут регестрируем все зависимости так как этот метод 
        // вызывается самым первым    
    }
}

для начало нужен ServiceCollection через него проводится регистрация

protected override void OnStartup(StartupEventArgs e)
{
    ServiceCollection services = new ();
}

для регистрации используется методы

 services.AddTransient<T>();
 services.AddSingleton<T>()
 service.AddScoped<T>();
  • Transient такой сервис создайся каждый раз по новой
  • Singleton такой сервис создайся один раз и приложение использует один и тоже экземпляр
  • Scoped создаётся каждый запрос но это используется для веба

Универсальная перегрузки

это дженерик (треуголки3) T место него можно поставить любой класс которым будет зависимостью главное то что он требует должно также зарегестрировать T1,T2 T1 это интерфейс а T2 это класс который его будет реализовывать позволяет не тянуть весь объект

Параметры

такие методы имеют параметр делегат Func<IServiceProvider,T> это так называемая фабрика что позволяет настроить то как объект будет создаваться

Создание провайдера

после регистрации делаем

IServiceProvider serviceProvider = services.BuildServiceProvider();

ServiceProvider это итоговый объект он уже хранит зависимости их его создаёт

serviceProvider.GetService<T>() тут мы заказываем то что ранее регестрировалии
Built with LogoFlowershow