2

У меня есть приложение N. каждое приложение по меньшей мере, включает в себя следующие узлы:Is Circle Dependency ошибка в дизайне

  • BusinessLogic
  • DataAccess

В некоторых приложениях сценарии 1 должны вызвать метод из BusinessLogic слоя приложения 2 и приложения 2 нужно вызвать метод из businessLogic уровня приложения 1. это условие приводит к циклической зависимости сборки между уровнями businessLogic приложения 1 и приложения 2. Я знаю, что это может привести к некоторым проблемам в процессе сборки. теперь мой вопрос: «Это ошибка в архитектурном дизайне? Если да, как его решить?»

ответ

0

Если App2 должен вызывать уровень бизнес-логики App1, это должен быть красный флаг задолго до того, как вы получите циклическую зависимость (потому что на самом деле это теперь бизнес-логика для app1 и app2).

Общим решением этого является то, что вы сделали бы при абстрагировании базового класса на языках ООП. Найдите части, которые являются общими, и вытесняете их из-под одного «приложения», в этом случае, и помещайте их в библиотеку, которую можно легко разделить.

В вашем случае я бы захватил операции бизнес-логики, которые являются долями, и поместил их в свою собственную сборку, которая названа так, чтобы обе могли ее уничтожить без проблем.

0

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

Нарисуйте свои компоненты и отношения и поместите каждый из них в обозначенный слой. Архитектура лука - отличный подход для проектирования вашей системы и определения всех активов, ответственности и отношений между ними. Прочитайте here и here.

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

0

Возможно наличие двух сборок взаимно зависимых (например, System.dll и System.Configuration.dll зависит друг от друга в .NET Fx). Но, как вы, возможно, испытали, вы должны упорно работать против визуального исполнения студии, чтобы избежать этого.

Ясно ациклический зависимостей между узлами является целью, которую вы должны достичь. Кроме того, ваши сборки не могут быть разработаны, скомпилированы и протестированы независимо.

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

  • Определения перезвонить интерфейс в DataAccess сборке
  • Реализовать этот обратный вызов интерфейс в BusinessLogic сборке (отсюда ссылки BusinessLogic сборки DataAccess сборки, но не наоборот)
  • проход один или несколько объектов, которые реализуют этот интерфейс, от BusinessLogic к DataAccess, посредством способа, определенного в DataAccess, который принимает обратного вызова, как интерфейс PARAMET э.

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


Лично я хотел бы пойти дальше, рассмотрят пространство имен при сборке в качестве компонентов, имеет ациклическую зависимость пространства имен, следует избегать использования сборки артефакта для определения компонентов. Это показано в двух белых книгах, которые я написал, доступных here.

Смежные вопросы