避免在项目之间进行双向通信的循环引用



我正在构建一个类似于i3wm/bspwm的开源平铺窗口管理器应用程序。希望看起来像这样,但对于Windows。屏幕顶部有一个小栏,显示您的"工作区",您可以单击工作区以显示其窗口。

目前,我的解决方案中有 3 个项目:栏、窗口管理器和通用。窗口管理器项目保存工作区等的状态,并具有 Bar 应该触发的命令。Common 只是保存 2 个项目之间共享的基础设施,就像一个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在窗口管理器项目中以编程方式调用。但是,这会导致两个项目之间的循环引用。

我怎样才能构建这个项目以避免循环引用?相当天哪,的卡在这里。

您需要将WindowManagerBar解耦。

如果Bar需要访问窗口管理器功能。使用事件/委托并让窗口管理器订阅,以便它可以在Bar上执行所需的操作。或者创建一个它们之间通用的接口,以便您可以将该合约传递给 bar。

无论哪种方式,您都需要重构它,以便逻辑依赖项目只负责在该级别对它们有意义的责任。

想想看,一个建筑商雇了一个瓦工。瓦工没有也不应该对建筑商使用的会计软件有任何了解,他只是在工作完成(事件(时退还发票,他不会调用输入发票,也不会在会计软件上向承包商付款。会计女士做她需要的事情,并向瓦工(或其他什么(提供工资。

简而言之,瓦工有一个事件,或者他们共享一个预定的公共合约(接口(,也就是说,如果bar有一个IWindowManager接口,它可以调用GetWorkspaces((。

无论如何,只有您有能力在没有循环引用的情况下对其进行逻辑拆分,以及对您有意义的内容

最新更新