Определение библиотеки классов интерфейсов - хорошее начало. Это дает вам максимальную гибкость, поскольку вы можете варьировать всех потребителей и всех разработчиков полностью независимо друг от друга.
Недостатком этого подхода является то, что если ваши интерфейсы сами экспортируют другие интерфейсы, как это:
public interface IMyInterface
{
IMyOtherInterface DoStuff();
}
вам может понадобиться написать много кода отображения, который может заполнять конкретные классы из интерфейсов (или вы можете использовать AutoMapper ).
Если у вас есть только один потребитель, но несколько имплементаторов, вы можете сэкономить часть этого отображения, определив интерфейсы вместе с потребителем (никогда с реализатором), но вы потеряете часть гибкости. Тем не менее, вы все равно можете изменять реализации независимо от потребителя, но не наоборот.