Циклические зависимости - PullRequest
       9

Циклические зависимости

5 голосов
/ 23 сентября 2008

Рассмотрим обычное приложение для заказов клиентов, основанное на шаблоне MVC с использованием WinForms. Часть представления слишком сильно выросла (более 4000 файлов), и ее необходимо разбить на более мелкие.


Для этого примера мы собираемся использовать 3 проекта для части просмотра:

  • Main - имеет зависимости от двух других проектов. Создает формы со списками.
  • Клиенты - имеет 2 формы - список клиентов и данные клиентов.
  • Заказы - имеет 2 формы - список заказов и детали заказа.

В форме сведений о клиенте также есть список заказов для этого клиента. Список получен от OrdersController, поэтому нет проблем с его получением. Когда пользователь выбирает заказ, список получает его гид и передает его в качестве ссылки на форму «Детали заказа».

Это будет означать, что нам нужно иметь ссылку на проект заказов в проекте клиентов. (1)

Но также в форме сведений о заказе есть ссылка на клиента, который сделал этот заказ. При нажатии откроется форма «Сведения о клиенте».

Это будет означать, что нам нужно иметь ссылку на проект «Клиенты» в проекте «Заказы». (2)

Из (1) и (2) мы будем иметь циклические зависимости между проектами Заказы и Заказчики.


Как этого избежать? Какая-то архитектура плагинов? Проект уже разработан, и наилучшее решение будет включать как можно меньшее изменение кода.

Ответы [ 4 ]

5 голосов
/ 23 сентября 2008

Измените хотя бы один из типов на интерфейс.

Например, иметь интерфейс ICustomer и тип Customer, который реализует этот интерфейс. Теперь добавьте ICustomer в проект заказов, а из проекта клиентов установите ссылку на проект заказов, чтобы вы могли реализовать интерфейс. Тип Order теперь может работать с типом ICustomer, не зная фактической реализации.

И для лучшего решения :-) Создайте интерфейс ICustomer и IOrder и добавьте их в третий библиотечный проект. И ссылаться на этот проект из двух других и работать только с интерфейсами, а не с реализацией.

2 голосов
/ 23 сентября 2008

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

0 голосов
/ 23 сентября 2008

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

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

0 голосов
/ 23 сентября 2008

Извлеките интерфейсы и поместите их в отдельную сборку. Поскольку вы используете архитектуру MVC, это не должно быть сложно. Взгляните на блок Microsoft Composite UI Applications для примеров и хороших практик.

...