Избегать циклических ссылок для двусторонней связи между проектами - PullRequest
2 голосов
/ 10 февраля 2020

Я нахожусь в процессе создания приложений менеджера окон с открытым исходным кодом, похожих на i3wm / bspwm. Надеюсь, будет выглядеть примерно так, но для Windows. В верхней части экрана есть небольшая полоска, на которой показаны ваши «рабочие пространства», и вы можете щелкнуть рабочую область, чтобы показать ее windows.

. В настоящее время в моем решении есть 3 проекта: Панель, Окно. Менеджер и общ. Проект Window Manager содержит состояние рабочих пространств и т. Д. c. и имеет команды, которые Бар должен запускать. Common просто содержит инфраструктуру, совместно используемую двумя проектами, например CommandBus для облегчения связи между проектами.

Проект Bar состоит из чего-то вроде этого:

public LaunchBar()
{
    // Launch WPF app.
    InitializeComponent();

    // Bind current workspaces to template.
    workspaces.ItemsSource = workspaceRepository.GetWorkspaces(); // workspaceRepository exists in Window Manager project
}

private void OnWorkspaceClick()
{
    commandBus.Invoke(new ChangeWorkspaceCommand()); // ChangeWorkspaceCommand exists in Window Manager project
}

Идея состоит в том, что LaunchBar вызывается программно в проекте Window Manager при обнаружении нового монитора. Однако это приводит к циклической ссылке между двумя проектами.

Как я могу go структурировать этот проект, чтобы избежать циклических ссылок? Довольно gosh черт возьми застрял здесь.

1 Ответ

3 голосов
/ 10 февраля 2020

Вам нужно отделить WindowManager от Bar.

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

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

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

Короче говоря, у каменщика есть событие, или у них общий заранее определенный общий контракт (интерфейс), то есть, если бар имеет интерфейс IWindowManager, он может вызывать GetWorkspaces () ,

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

...