【问题标题】:How to avoid duplicating logic on two similar WinForms?如何避免在两个相似的 WinForms 上重复逻辑?
【发布时间】:2008-11-03 18:25:15
【问题描述】:

我有两种表格,表格A和表格B。这些表格在外观上肯定不同,但它们共享很多逻辑。问题在于此逻辑与外观相关(验证按钮单击、触发事件等)。例如,我有一个名称字段,当按下保存按钮时,我需要触发一个事件,该事件导致父表单验证记录名称以避免重复。两种形式都需要这个逻辑,但是它们的保存按钮在不同的地方,并且发生错误时显示的工具提示也需要出现在不同的地方。这只是一个例子,但有人知道我可以避免在这里复制和粘贴代码的方法吗?也许我遗漏了一些明显的东西......

【问题讨论】:

    标签: c# .net coding-style


    【解决方案1】:

    您可以创建一个包含以两种形式表示的数据的对象,并将验证逻辑放入该对象中。表示层应该使用输入的数据填充该对象,要求对象验证自身,然后以特定于表单的方式处理验证错误。

    【讨论】:

      【解决方案2】:

      如果通用逻辑与 UI 相关,您需要使用所需的逻辑创建自己的自定义表单类(继承自 Form 类)。那么您需要做的就是在表单中继承该类。

      如果公共逻辑与 UI 相关性较低,请创建一个封装公共逻辑的内部类,并从两种表单中调用它。

      【讨论】:

        【解决方案3】:

        您需要在 2 个视图和共享模型之间添加一个控制器。这样你只需要这样做: myController.save();而不必调用模型对象以将它们保存在两种 winform 中。

        【讨论】:

        • 虽然这是一个正确的答案,但考虑到这个问题,我认为它对 OP 来说并不是非常有用。一些指向 MVC、MVP 和使用 WinForms 实现的链接可能会很有帮助。
        • 谢谢,但我不认为在这种情况下实现 MVC 类型逻辑在这一点上是非常实用的。
        • 嗯,这是一个灵活性的例子 -> 努力。 (从最少的努力)您可以只在静态方法中使用共享代码,让表单共享一个对象,最后(flexibility++)一个拥有表单的对象(控制器)。
        • 好吧,接受的答案正是我 1 小时前写的:拥有一个“控制器”,可以保存、有效以及您需要的所有其他不应该出现在视图中的东西 (WinForm)。我可能没有足够的解释......
        • 是的。说实话,虽然我知道 MVC 的基础知识,但我从未正式使用过它。我仍然给你 +1 帮助。
        【解决方案4】:

        我能想到的重构这些表单以共享逻辑的方法很少。您可以结合使用其中的一种或多种:

        1. 创建 UI 特定的“bean”对象,用于包装您的业务对象并添加在表单之间共享的附加功能。这个 bean 可以做一些事情,比如创建工具提示、协助验证、事件等。
        2. 创建一个具有常用功能的辅助类。概括这两种形式的逻辑,调用这个辅助类来实现常用功能。
        3. 增强您的业务对象以进行验证。我并不是说您的 BO 应该了解任何 UI,但他们可以/应该执行业务规则。这可能会将一些验证逻辑从您的表单中拉出并放到一个公共位置。
        4. 创建特定于您正在处理的数据类型的自定义控件,并在两个表单上使用这些控件。

        【讨论】:

          【解决方案5】:

          您可能还想看看CSLA Framework,我在过去的项目中非常成功地使用它来帮助减少不同 UI 之间重复代码的数量。它利用了 .NET 的数据绑定功能,但我认为不必为了充分利用框架而使用数据绑定。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-11-27
            • 2020-08-12
            • 2010-10-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多