When to use interface and abstract class - https://www.c-sharpcorner.com/article/when-to-use-abstract-class-and-interface-in-real-time-projects/
Interface = Abstract class without non abstract methods and members. Default scope for all interface members is Public
Virtual methods are those which can be overriden in the derived classes. By default class members are not virtual and hence cannot be overriden in derived classes.
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/virtual
Inversion of Control - https://www.youtube.com/watch?v=vFzP2SaMyA0
Seperation of Concerns - https://www.youtube.com/watch?v=SPVxCBP_7cQ
Async Await - https://www.youtube.com/watch?v=V2sMXJnDEjM
Post Redirect Get (PRG) - https://en.wikipedia.org/wiki/Post/Redirect/Get