Я использую Castle Windsor / Microkernel, у меня нет опыта ни с чем, но мне это очень нравится.
Что касается того, как вы решаете, что вводить? До сих пор мне помогло следующее практическое правило: если класс настолько прост, что ему не нужны модульные тесты, вы можете свободно создавать его экземпляр в классе, в противном случае вы, вероятно, захотите получить зависимость через конструктор.
Что касается того, следует ли вам создавать интерфейс, а не просто делать ваши методы и свойства виртуальными, я думаю, что вы должны пойти по маршруту интерфейса, либо, если вы либо a) можете видеть, что класс имеет некоторый уровень повторного использования в другом приложении (например, в логгере). ) или b) если либо из-за количества параметров конструктора, либо из-за значительного количества логики в конструкторе, в противном случае класс будет трудным для насмешки.