Здравствуйте! Разбираюсь с темой интерфейсов, задавая вопрос "для чего, зачем нужны интерфейсы", часто получал ответ для слабой связанности компонентов/заменяемости компонентов, для лучшего тестирования. И вопрос такой часто ли вы окружаете интерфейсами свои слои приложения, или еще что то? Часто ли у вас было что ваши репозитории окруженные интерфейсами используют MSSQL, и есть еще такие же репозитории но уже использующие к примеру MongoDB, и где нито вы подменяете одно другим? Часто ли у вас было что у вас есть 2 разных слоя сервисов, окруженных интерфейсами, и опять же вы один подменяете другим? Такое реально возможно, если вряд ли, либо вероятность мала, получается интерфейсы в основном используются для тестирования, чтобы можно было использовать моки? Так ли, разъясните, разжуйте, приведите реальные примеры, очень хочу в теме разобраться
AtomKrieg: в русском языке, чтоб ты знал, вопросительное предложение помечается вопросительным знаком, в моем сообщении есть эти вопросительные знаки, и стало быть, вопросы там имеются, внимательнее читай текст
Рискую повториться, но позволю описать свое видение.
Можно выделить несколько случаев, когда удобно использовать интерфейсы:
Абстракция, предполагающая несколько одновременно используемых реализаций. Например IEnumerable или как пример с паттерном "Стратегия" в первом комментарии.
Несколько взаимозаменяемых реализаций одной абстракции. Например логгер, можно логировать в файл, в табличку на форме, в БД.
Замена для тестирования. Хотя при желании это можно сделать и с виртуальными методами, но как правило, с интерфейсами удобнее, с учетом множественной реализации нескольких интерфейсов, но наследование только от одного базового класса, да и базовая реализация как правило тянет за собой клубок зависимостей.
Для следования принципу инверсии зависимостей. Очень рекомендую ознакомиться с принципами SOLID, два из которых как про интерфейсы - принцип инверсии зависимостей и принцип разделения интерфейсов. Если кратко про инверсию - потребители должны зависеть от абстракции, а не от реализации, в том числе на уровне сборок. Чтобы сократить и упорядочить зависимости между сборками, как правило выделяют сборку с интерфейсами и контрактами, которую используют сборки с реализацией, сборки потребители и сборки с тестами.
По поводу когда следует вводить интерфейс - обычно я ввожу интерфейс, если вижу в этом смысл по описанным выше причинам, если смысла нет, то и вводить не тороплюсь, ведь его всегда можно выделить, главное чтобы была понятная для вас причина.