Ваша первая проблема - ваши сущности в вашем веб-проекте. С самого начала у вас есть тесная связь между веб-проектом и вашим слоем данных, что в значительной степени сводит на нет все остальные ваши уровни: DTO, репозиторий и т. Д. Вы хотите переместить свои сущности и контекст в истинное слой данных (т.е. проект библиотеки классов, отдельный от вашего веб-проекта).
Затем вы хотите решить, насколько далеко должен простираться ваш уровень данных. Если API предназначен для веб-сайта, то вы фактически хотите удалить все зависимости на уровне данных из веб-проекта. Ваш проект DTO будет разделен между API и веб-проектами, а ваш API будет отправлять / получать ваши DTO, сопоставляя их от своих сущностей.
Однако, если вы собираетесь это сделать, тогда проект репозитория должен полностью исчезнуть. Просто пусть ваш API работает напрямую с EF и вашими сущностями. Ваша абстракция - это сам API; нет необходимости в другом. Единственная причина иметь уровень хранилища - это то, что и API, и Web будут напрямую использовать хранилища, что на самом деле не очень хорошая модель. Вы неизбежно получите кучу дублированной логики, характерной для каждого проекта.
Проще говоря, шаблон репозитория является излишним при использовании ORM, такого как EF. ORM - это ваш уровень данных. Вы просто используете DAL, предоставленный третьей стороной, а не тот, который вы создали сами. Шаблон репозитория имеет смысл только при работе напрямую с SQL, используя что-то вроде ADO.NET напрямую. Иначе избавься от этого.
Наличие API - это достаточно абстракция, если ваша цель - просто скрыть слой данных. Веб-сайт ничего не знает о базовом источнике данных, и API - это на самом деле просто сервисный уровень, который возвращает JSON через HTTP, а не экземпляры объектов напрямую, т. Е. API является , по сути, вашим уровнем «хранилища».
Ситуацию можно улучшить еще больше, перейдя на архитектуру на основе микросервисов. При этом у вас по сути есть несколько небольших, автономных API, которые работают только с одной частью вашего домена или частью функциональности. Каждый может использовать EF напрямую, или совершенно другой ORM, или даже совершенно другой стек. У вас могут быть API-интерфейсы, основанные на Node.js или Python и т. Д. Веб-сайт просто отправляет запросы различным службам для получения необходимых данных, и ему неизвестно, как эти службы на самом деле работают.