В настоящее время у нас есть довольно много классов в проекте, и каждый из этих классов реализует интерфейс, в основном по причинам DI.
Теперь мое личное мнение состоит в том, что эти интерфейсы должны быть помещены в отдельное пространство имен внутри одной сборки (поэтому у нас есть сборка MyCompany.CoolApp.DataAccess
и внутри нее есть пространство имен Interfaces
, дающее MyCompany.CoolApp.DataAccess.Interfaces
).
Однако кто-то предположил, что эти интерфейсы должны фактически находиться в их собственной сборке. И мой вопрос: они правы? Я вижу, что есть некоторые преимущества (например, другим проектам нужно будет только потреблять сборку интерфейса), но в конце этого дня все эти сборки будут загружены. Мне также кажется, что может возникнуть несколько более сложная проблема с развертыванием, поскольку Visual Studio не будет автоматически вытаскивать сборку реализации в папку целевого bin.
Есть ли рекомендации для этой практики?
EDIT:
Чтобы сделать мой вопрос немного яснее: мы уже разделяем UI, DataAccess, DataModel и другие вещи на разные сборки. В настоящее время мы также можем заменить нашу реализацию с другой реализацией без какой-либо боли, поскольку мы сопоставляем реализующий класс с интерфейсом с использованием Unity (IOC framework). Я должен отметить, что мы никогда не пишем двух реализаций одного и того же интерфейса, кроме причин полиморфизма и создания макетов для модульного тестирования. Таким образом, мы в настоящее время не "заменяем" реализацию, кроме модульных тестов.
Единственный недостаток, который я вижу в том, что интерфейс в той же сборке, что и реализация, заключается в том, что вся сборка (включая неиспользуемую реализацию) будет загружена.
Однако я могу видеть, что наличие их в другой сборке означает, что разработчики не будут случайно "новым" классом реализации, а не создаются с использованием обложек IOC.
Один вопрос, который я не понял из ответов, - проблема развертывания. Если я просто зависим от интерфейсных сборок, у меня будет что-то вроде следующей структуры:
MyCompany.MyApplication.WebUI
References:
MyCompany.MyApplication.Controllers.Interfaces
MyCompany.MyApplication.Bindings.Interfaces
etc...
Когда я создаю это, сборки, которые автоматически помещаются в папку bin, являются только этими сборками интерфейса. Однако мои сопоставления типов в единстве отображают различные интерфейсы с их фактическими реализациями. Как сборки, содержащие мои реализации, попадают в папку bin?