Все очень хорошие ответы. И я хотел бы содействовать общей консенсусе «в меру».
Быстрый анекдот Однако
Я лично видел целые решения, которые взрываются с распространением определенной функции узлов. Я также видел монолитные подходы. Повторяю: вы хотите что-то между ними.
В моих личных проектах я использую много инъекций зависимостей [DI] и инверсии управления [IoC], а также использовать контейнер Castle Windsor для многого тяжелого подъема. Я также заранее определяю, какие компоненты требуют «широкого» масштаба, и какие из них не требуют воздействия. Например, служба [скажем, сам контейнер или брокер событий] будет считаться «широким», так как, вероятно, многие пользователи этой услуги могут пользоваться во всем приложении. Компонент, который изолирован [скажем, форматирующий формат даты], будет не быть широким, так как никто не заинтересован в том, чтобы потреблять его напрямую, за исключением того, для которого он предназначен.
Широкие интерфейсы, я бы разместил отдельную сборку SomeProductName.Interfaces
.
Бизнес-интерфейсы могут быть размещены в их собственной функционально-ориентированной сборке SomeProductName.SomeStuffForAlice
и SomeProductName.SomeStuffForBob
, как правило, той же библиотекой, что и ее реализация.
Ассембли являются лишь физическим представлением организации-источника - они фактически ничего не означают сами по себе [то есть монолитный затор, хотя и отталкивает, функционально эквивалентен хорошо организованному решению и тревожному проекту за один кошмар интерфейса) ,
Организационное соглашение полезно только в том случае, если оно служит его потребителю [вы! разработчик]
Что значит, вы не можете изменить один интерфейс с помощью опции 1? –
, если сборка интерфейса сильна, тогда для изменения интерфейса потребуется изменение версии, означающее, что все клиентские компоненты должны быть повторно скомпилированы. – dice
Yep - вот что я имел ввиду – JohnIdol