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

问题描述 投票:0回答:1

我正在构建类似于i3wm / bspwm的开源切片窗口管理器应用程序。 Would hopefully look something like this, but for Windows。屏幕顶部有一个小栏,显示您的“工作区”,您可以单击工作区以显示其窗口。

目前,我的解决方案中有3个项目:Bar,Window Manager和Common。窗口管理器项目保存工作区等的状态,并具有Bar应该触发的命令。 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
}

想法是,当检测到新的监视器时,将在Window Manager项目中以编程方式调用LaunchBar。但是,这导致两个项目之间存在循环引用。

我如何着手构建这个项目以避免循环引用?相当糟糕的东西卡在了这里。

c# architecture domain-driven-design cqrs
1个回答
1
投票

您需要将WindowManagerBar解耦。

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

无论哪种方式,您都需要以某种方式进行重构,以使逻辑相关项目仅负责在该级别对其有意义的责任。

考虑一下,建筑商雇用了瓦工。瓦工没有也不应该对建造者使用的会计软件有任何了解,他只是在工作完成后退还发票(事件),他不致电输入发票,也不向承包商付款软件。会计女士做她所需要的,并向瓦工(或任何其他)支付工资。

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

无论如何,只有您有能力在没有循环引用的情况下从逻辑上将其拆分,这对您来说有意义]

© www.soinside.com 2019 - 2024. All rights reserved.