Для данного проекта кода, который должен придерживаться принципа SoC путем реализации слабосвязанных слоев, наличия контейнера IoC и т. д., например, простое решение ASP.NET MVC, которое разделено на следующие сборки:
- Приложение сборка+пространство имен
- Модель сборка+пространство имен (содержит конкретный репозиторий для доступа к данным БД)
и если конкретный репозиторий в сборке Model должен реализовывать общий интерфейс IMyBusinessRepository
, в какую сборку вы поместите этот интерфейс?
1) Если вы поместите этот интерфейс в сборку Model, есть вероятность, что будет невозможно заменить эту сборку другой (по крайней мере, если она имеет другое пространство имен) без изменения кода < em>Приложение в сборке. Кроме того, альтернативная реализация IMyBusinessRepository
, находящаяся в другой сборке, должна будет ссылаться на исходную (ааа!)
2) Если вы поместите его в сборку Application, будет невозможно использовать сборку Model в других проектах без ссылки на сборку Application ( Арх!)
3) Или вы бы создали отдельную общую сборку только для этого интерфейса и, если на то пошло, для каждого общего интерфейса или набора интерфейсов? (Аргх?)
Подводя итог, сборка X должна легко заменяться в приложении A (просто изменением ссылки) и повторно использоваться в приложениях B, В, Г.