IoC Container는 일종의 Factory입니다.
class라는 설계도를, 1개만 생성할지(AddSingleton), 세션 내에서는 공유할 것인지(AddScoped), 요청할 때마다 계속 새로운 인스턴스를 만들어낼 것인지(AddTransient)를 등록하는 시점에 결정합니다.
디버깅을 찍어보시면 아시겠지만 위의 메서드를 호출할 때는 Constructor를 타지않습니다. 아직 인스턴스 생성이 되는 단계가 아니기 때문입니다.
일반적으로 C#을 처음 배우고 IoC Container를 모를 때는
class A {}
A abc = new A();
위와 같은 방법으로 인스턴스를 생성합니다.
하지만 말씀하신 대로 GetRequiredService를 호출 할 때는 생성자의 인자들을 고려하지 않고 생성할 수 있게 됩니다.
아래 제가 과거에 적어둔 글을 참조하시면 좋을 것 같습니다.
이 때 생성자 주입이 발생하면서 IoC Container에 들어있던 class 들이 AddTransient, AddScoped, AddSingleton의 형태에 따라 새로운 인스턴스가 주입될 수도, 기존의 인스턴스가 주입될 수도 있습니다.
하지만 최초에 호출될 때 Lazy하게 호출되기 때문에 생성자가 호출되는 시점은 소스코드를 많이 돌려보시면서 직접 이해하시는 게 좋을 것 같습니다.
개념은 충분히 있으니 직접 예제코드를 만들어 보셔서 디버깅해보시는 해보시는 시간을 2시간 정도만 가져보시면 충분히 이해하실 수 있을 거라 생각합니다.
다만 WPF를 통해 Microsoft.Extensions.DependencyInjection을 처음 접하시는 분들에게는 AddScoped와 AddSingleton이 헷갈리 실 수 있습니다.
Microsoft.Extensions.DependencyInjection은 제가 알기로 맨 처음 ASPNET를 위해 설계되었기 때문에 웹을 고려하여 세션개념을 넣어서 만들었다고 알고 있기 때문입니다.
따라서 세션개념이 없는 Desktop Application인 경우 세션이 있다면 1개라고 생각할 수 있기 때문에 프로세스 내부에서 AddSingleton과 동일한 형태로 동작하게 됩니다.
이 부분만 이해해보시면 될 것 같고, 만약 이런게 마음에 들지 않으신다면 다른 IoC Container 로
등등이 있습니다.