Sitecore Helix is there for a good reason. It tells you how to organize stuff such that it looks smart and it’s maintainable. You can see the sample implementation in Sitecore Habitat but you might miss a few things that I would like to emphasize here.
If you like to be cool and all, you say, each feature should be Atomic and therefore holds it’s Templates, Modules, Logic, etc . Yes! right! Brilliant! But then Search happens. Take this scenario. You have a feature called Articles which obviously does lot’s of things and then client wants to make those Articles searchable. These are two different features and you don’t want to write Search related code in your Articles feature. Search needs access to your article Templates and if you are smart enough you are keeping your queries in the Foundation level. Since Foundation level shouldn’t reach out to Features, you have to relocate your templates down to Foundation where multiple features and/or foundation modules can access it. Taxonomy project is the grave yard of atomic Features and the idea of reusable component. It’s ugly but can’t be avoided. If you have a work around this, buzz me.
Ideally, in your Foundation Level you should have ItemRepository, DictionaryRepository, LogRepository, and Caching. These all are the single point of access to Sitecore. Your features should only use these foundation Modules to get Datasources, Items, Settings, and basically every data you need from DB. Having these classes centralized simplifies your life in the future. The best example that supports this approach is changes in Glass Maper. The new Glass Mapper (Sitecore 9.2+) uses IMVCContext and IRequestContext instead of ISitecoreContext. When you upgrade your solution to a new Sitecore, you will have to refactor only one place and that is the ItemRepository and no other feature needs refactoring (Voila). Additionally, your unit testing will be much easier.
If you wan to use Sitecore DI, you should create a config file or a class to register each service. This just doesn’t make sense to have extra class or extra files in every single project. Create a foundation class that is in charge of automatic registration of all the services. Sitecore habitat has the right code.