如何将“GUI”层与“业务逻辑”层分离?

4
我目前有一个“Business Object”项目,我们的目标是在GUI和业务对象之间实现清晰分离。但是,我的项目引用了“System.Windows.Forms”,这对于所有人来说都是糟糕设计的标志。
我的问题是我正在使用一个叫做“Active Query Builder”的第三方控件。它是一个GUI中的“Control”,即“System.Windows.Forms.Control”;但它从未显示在任何地方,也没有添加到任何窗体的控件集合中。同时,它为业务对象提供了许多核心功能。
无论如何,如果不引用“System.Windows.Forms”,我将无法使用第三方控件,并且BO将会严重受损。但据说我不能引用“System.Windows.Forms”,因为它是糟糕的编程实践。
我完全不知道该怎么办。
能否有更多设计模式类型经验的人提供解决方案吗?
4个回答

6

所以你有一个引用了WindowsForms的库,但它没有直接使用任何东西?你的BO项目没有与任何表单搞在一起?

我觉得你没事,这个引用只是一个红旗,提示你要等待为什么要这样做。但只要层仍然逻辑上分离,那么在我看来就没问题。

你可以将其抽象成另一个项目,处理与查询生成器的交互。因此,你的BO项目将与Query Builder项目一起使用,后者将知道如何使用此控件。


如果您知道的话,我很想听听为什么我得到了-1。我很好奇听听您的意见。 - JoshBerke

3

我可能说错了,但是System.Windows.Forms只是.NET Framework的一个组成部分,并不构成GUI。它可能有许多有用的功能,您可以利用这些功能而不显示任何内容。我认为声称不应该使用它的人可能误解了原则。

如果您正在开发n层应用程序,则通常会操作GUI-Business Logic-Data Store分离,但GUI严格是呈现给用户以允许交互的用户界面,而不是促进它的框架。


2

我对Active Query Builder只有一点点了解,但它不是一个用于创建SQL查询的GUI组件吗?我不知道这种组件如何适用于业务对象。


我也不熟悉它,但如果它允许在设计时构建查询,然后需要组件在运行时执行,那么将其包含并使用表单是有意义的。 - Lazarus
除了 GUI 控制之外,它还提供生成 SQL 和一些很棒的功能。基本上,我有一堆“条件”,想要返回匹配的数据或获取这些匹配所需的 SQL。 AQB 控制是其核心 - 但我们已经在此基础上进行了大量构建,并希望其他业务对象利用该功能。 - Rob P.
(我不确定这是否证明它应该在BO中 - 也许根本不应该出现) - Rob P.

1

您可以为控件创建一个包装类,该类实现了您需要的方法的接口。您的业务对象可以依赖于该接口,该接口可以由任何东西实现(在这种情况下是一个控件)。

这确实引起了一些担忧,即这个“控件”具有与UI无关的功能;它只是感觉不对劲。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接