Я склонен делить свои решения на компоненты с четко определенной областью ответственности, такие как набор классов и другие типы, работающие вместе для решения какой-то конкретной проблемы. Классы, составляющие общедоступный фасад такого компонента, обычно очень выигрывают от наличия интерфейсов, поскольку это позволяет мне легко заменять или заглушать их для тестирования и общего обслуживания. Независимо от того, добавляете ли вы интерфейсы для классов, используемых внутри, только для целей модульного тестирования, решение обычно определяется внутренней сложностью, а также тем, использует ли сам компонент другие компоненты, которые необходимо исключить.
Создать интерфейс для класса действительно довольно просто, учитывая, что в Visual Studio даже есть необходимые встроенные параметры рефакторинга (щелчок правой кнопкой мыши, refactor-> extract interface). Таким образом, усилия по созданию интерфейса для создания интерфейса несколько тривиальны (при условии, что дизайн определяется тем, как класс выглядит в итоге).
Несмотря на то, что со временем поддерживаются некоторые интерфейсы, я использую их чаще, чем нет. Это уменьшает открытость интерфейса API, что упрощает обслуживание, и если у вас есть такие инструменты, как R #, то никаких дополнительных усилий почти не требуется.
Стоит также упомянуть, что TypeMock и Moles (компаньон Pex) оба подключаются к API профилирования. Как таковая, она несколько отличается от AOP, хотя и предоставляет возможности, подобные AOP. Они полезны, когда вам нужно перехватить статические методы или регулярные обращения к полям, то, что вы не можете моделировать с помощью интерфейсов.