https://medium.com/@anderson.buenogod/how-to-implement-the-dependency-inversion-principle-dip-in-c-net-8-5d03d57c0ae4