Интерфейсы полезны, когда вы хотите смоделировать взаимодействие между объектом и одним из его соавторов. Однако в интерфейсе меньше значения для объекта, который имеет внутреннее состояние.
Например, скажем, у меня есть служба, которая общается с хранилищем, чтобы извлечь некоторый объект домена, чтобы каким-то образом манипулировать им.
Существует определенная конструктивная ценность при извлечении интерфейса из хранилища. Моя конкретная реализация репозитория вполне может быть тесно связана с NHibernate или ActiveRecord. Связывая мой сервис с интерфейсом, я получаю четкое разделение от этой детали реализации. Так уж получилось, что теперь я могу написать супербыстрые автономные модульные тесты для своего сервиса, теперь я могу передать его имитирующему IRepository.
Учитывая доменный объект, который вернулся из хранилища и на который действует моя служба, ценность меньше. Когда я пишу тест для своего сервиса, я хочу использовать реальный объект домена и проверять его состояние. Например. после вызова service.AddSomething () я хочу проверить, что что-то было добавлено к объекту домена. Я могу проверить это, просто проверив состояние объекта домена. Когда я тестирую свой доменный объект изолированно, мне не нужны интерфейсы, так как я собираюсь только выполнять операции над объектом и проверять его во внутреннем состоянии. например может ли овца есть траву, если она спит?
В первом случае нас интересует взаимодействие на основе тестирования. Интерфейсы помогают, потому что мы хотим перехватывать вызовы, передаваемые между тестируемым объектом и его соавторами, с помощью имитаций. Во втором случае нас интересует тестирование на основе state . Интерфейсы здесь не помогают. Постарайтесь понять, тестируете ли вы состояние или взаимодействия, и позволяете ли это повлиять на ваш интерфейс или нет решения об интерфейсе.
Помните, что (если у вас установлена копия Resharper), чрезвычайно дешево извлечь интерфейс позже. Также дешево удалить интерфейс и вернуться к более простой иерархии классов, если вы решите, что вам все-таки не нужен этот интерфейс. Мой совет - начинать без интерфейсов и извлекать их по требованию, когда вы обнаружите, что хотите смоделировать взаимодействие.
Когда вы добавляете IoC к изображению, я хотел бы извлечь больше интерфейсов, но постарайтесь не ограничивать количество классов, которые вы помещаете в свой контейнер IoC. В общем, вы хотите ограничить доступ к этим объектам обслуживания в основном без сохранения состояния.