Все очень хорошие отзывы. И я хотел бы содействовать общему консенсусу "в умеренности".
Быстрый анекдот, однако,
Я лично видел, как целые решения взрываются с распространением функционально-ориентированных сборок. Я также видел монолитные подходы. Повторяя: вы хотите что-то среднее.
В своих личных проектах я часто использую Dependency Injection [DI] и Inversion of Control [IoC] и использую Castle Windsor Container, чтобы выполнять тяжелую работу. Я также на раннем этапе определяю, какие компоненты требуют «широкого» охвата, а какие не требуют воздействия. Например, сервис [скажем, сам контейнер или брокер событий] будет считаться «широким», так как, вероятно, будет много потребителей этой услуги во всем приложении. Компонент, который изолирован [скажем, специфичный для бизнеса форматер даты], будет не широким, поскольку никто не заинтересован в его непосредственном использовании, кроме бизнеса, к которому он относится.
Широкие интерфейсы, я бы поместил в отдельную SomeProductName.Interfaces
сборку.
Специфичные для бизнеса интерфейсы могут быть размещены в своих собственных функционально-ориентированных сборках SomeProductName.SomeStuffForAlice
и SomeProductName.SomeStuffForBob
, обычно в той же библиотеке, что и их реализация.
Сборки - это просто физическое представление исходной организации - они на самом деле ничего не значат сами по себе [то есть монолитное смешение, хотя и отвратительно, функционально эквивалентно хорошо организованному решению и мешающему проекту на каждый интерфейсный кошмар].
Организационное соглашение полезно только в том случае, если оно обслуживает своего потребителя [вас! разработчик!]