Модули на одном уровне в многоуровневой архитектуре - PullRequest
0 голосов
/ 25 мая 2009

Теоретически в многоуровневой архитектуре вы можете иметь несколько модулей на одном слое. Могут ли эти модули перекрестно ссылаться друг на друга? Это возможно технически, например. используя .NET?

Ответы [ 3 ]

1 голос
/ 25 мая 2009

Конечно, это возможно, просто будьте осторожны, чтобы не вводить циклические зависимости между модулями. В общем, модули на данном уровне должны зависеть только от других модулей того же уровня или от уровней ниже его. Модули не должны знать о слоях над ними.

Если вы хотите сделать это еще более строгим, вы также можете ограничить зависимости для других модулей из того же или других слоев непосредственно ниже текущего.

Сохранение открытого интерфейса до минимума, например, показывать только основной набор общедоступных интерфейсов, объектов-значений и исключений - это всегда хорошая идея. Вы можете использовать функции управления доступом языка (то есть private / package / public), чтобы ограничить видимость внутренних элементов модуля от проникновения в другие слои.

0 голосов
/ 25 мая 2009

как сказал Павел, будьте осторожны с вашими циклическими зависимостями. Если вы абсолютно не можете жить без циклической зависимости (то, что вы называете перекрестной ссылкой), классы должны быть не только из одного «слоя», но и из одной и той же сборки.

При этом не должно быть никаких причин для перекрестных ссылок - не только (как сказал Павел) модули должны зависеть только от слоев ниже их, что односторонняя зависимость должна существовать во всех случаях.

Есть некоторые логические исключения из этого правила, например, в чем-то вроде доменной модели - скажем, у клиента будет несколько заказов. В этом случае может быть полезно (особенно с ORM и т. Д.) Иметь список заказов на клиента и ссылку на клиента из каждого заказа. С точки зрения функциональных единиц, таких как сервисы и т. Д., Зависимости должны быть только односторонними.

Одним из способов решения этой проблемы является использование Inversion of Control через Windsor, autofac, spring.net и т. Д. Вы можете определить интерфейс в сборке и другой объект, который потребляет конкретную реализацию этого интерфейса. Другая библиотека может содержать фактическую реализацию (это означает, что сборка должна ссылаться на первую сборку). В этом случае контейнер IoC захватывает реализацию.

0 голосов
/ 25 мая 2009

Технически вы можете создавать перекрестные ссылки в любом направлении в .NET (для DAL нет технических ограничений для ссылки на компонент пользовательского интерфейса, даже если это не очень хорошая идея). Я не вижу проблем со ссылками на модули в одном слое.

Но нам нужно немного взглянуть на слово «слой», поскольку слои бывают разных форм и размеров. Часто, когда мы используем слово «слой», мы думаем, что уровень доступа к данным или уровень представления данных, и мы обычно позволяем слоям смотреть вниз, но не вверх.

Внутри каждого слоя различные модули также могут логически выстраиваться в слои. То же правило применяется здесь; модуль может смотреть вниз, но не вверх. Имея это в виду, вполне безопасно ссылаться на модули внутри одного (внешнего) слоя.

Только не делайте, чтобы два модуля ссылались друг на друга, прямо или косвенно. Если вы обнаружите, что A и B оба нуждаются в функциональности друг от друга (что указывает на то, что A и B находятся на одном уровне), вам, вероятно, потребуется реорганизовать код, возможно, введя новый модуль C, логически расположенный под A и B, который из них можно использовать.

Также имейте в виду, чтобы модули были максимально отсоединены; чем меньше они знают друг о друге, тем лучше.

...