The most simplistic way I can think of to represent the communication flow in the framework, is this:
The operator will interact with the Team Server via a management API to carry out actions such as listing implants, tasking them, and getting results back. The implant itself will also talk to the Team Server over its C2 protocol, such as HTTP, to retrieve said tasks and send results back. These two components require some sort of "link" or a means for moving data from one side to the other. In ASP.NET Core, Dependency Injection (DI) can be used to ensure that these components have access to the necessary classes, methods, and data required for them to function.
Objects added to the DI container are referred to as "services". A service will have an interface and a class which implements it. The interface itself represents a "contract" between the component consuming the service and the class which implements it. The interface defines method names, their return types and any input parameters. The implementing class contains the actual code that's executed when a method on the interface is called.
Throughout the course we will build services that manage the different components of the Team Server such as listeners, implants and tasks. Those services will then be dependency injected into the user API controllers and implant listener controller to achieve the desired functionality.