在此场景中您会使用什么模式或实现方法?

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

仅供参考:我制作了有用的 WinForms 和控制台 (C#) 以及 PowerShell 应用程序,但我对 OO 设计很弱。我的专业编程生涯完全是过程式编程。通过 OJT(在 S.O. 的大力帮助下),我学习了 OOP、.NET、WinForms、C# 和 Word 互操作的基础知识。正如他们所说,“我知道的足够危险”。

我已经达到了“边编码边设计”的地步,但我陷入了困境。

背景和问题

我正在编写一个 Word VSTO 插件。我正在使用自定义任务窗格 (CTP) 实现其 UI。您可能知道,对于每个 CTP,您必须至少定义一个用户控制 (UC) 对象。为了便于讨论,我的加载项将包含 5 个用户控制对象

  1. P 类(已实现)
  • 源自 Microsoft UserControl 类
  • 托管各种与生产相关的 UI 选项控件
  1. T 类(部分实现)
  • 源自 Microsoft UserControl 类
  • 托管各种与测试相关的 UI 选项控件
  1. F1、F2 和 F3 类(已实现)
  • 目前,每个都派生自 P 类
  • 每个都是一个数据输入表单,托管与数据输入场景 1、2 或 3 相关的各种 UI 控件。
  1. 注释
  • 用户可以显示 P 形式或 T 形式。
  • 当P表单显示时,用户可以显示表单F1或F2或F3并与之交互。

这就是我被困住的地方:

我正在实现类 T,我意识到像类 P 一样,当用户显示表单 T 时,他们还需要显示表单 F1 或 F2 或 F3 并与之交互。无论使用表单 P 还是表单 T,表单 F1、F2 和 F3 上的控件背后的业务逻辑都是相同的。

我下意识地想从 P 和 T 中派生出 F1、F2 和 F3,但 C# 不支持多重继承

我已经阅读了足够多的内容,知道(但没有完全理解)界面可能会解决我的问题,但总的来说,它似乎有点笨拙。

我已经研究了面向对象的设计模式,抽象工厂模式看起来很有希望,但在我自己编写代码之前,我正在寻找第二种意见,因为:…使用这种模式…可能会导致最初编写代码时不必要的复杂性和额外工作。此外,更高级别的分离和抽象可能会导致系统更难以调试和维护。

在此场景中您会使用什么模式或实现方法?

这里有一个额外问题:迫使程序员实现 C# 接口的场景(条件、动机?)是什么?

c# winforms oop design-patterns vsto
1个回答
0
投票

无论使用 P 表单还是 T 表单,F1、F2、F3 表单控件背后的业务逻辑都是相同的

我相信您可以将业务逻辑解耦到一个单独的类,并将其注入到您的表单中,例如F1

F2
F3
。
业务逻辑解耦后,就可以在Winforms中使用
MVP模式

您可以通过创建抽象及其实现来解耦和提取业务逻辑。

这是业务逻辑的抽象。简而言之,这是一种

依赖倒置原则

public interface IMySharedBusinessLogic { void SharedBusinessBehavour_1(); void SharedBusinessBehavour_2(); void SharedBusinessBehavour_3(); }
这就是抽象的具体实现:

public class MySharedBusinessLogic : IMySharedBusinessLogic { public void SharedBusinessBehavour_1() { throw new NotImplementedException(); } public void SharedBusinessBehavour_2() { throw new NotImplementedException(); } public void SharedBusinessBehavour_3() { throw new NotImplementedException(); } }
然后像这样

注入你的依赖项

//using Microsoft.Extensions.DependencyInjection; public partial class Form1 : Form { private readonly IMySharedBusinessLogic mySharedBusinessLogic; public Form1(IMySharedBusinessLogic mySharedBusinessLogic) { InitializeComponent(); this.mySharedBusinessLogic = mySharedBusinessLogic; MessageBox.Show( mySharedBusinessLogic.SharedBusinessBehavour_1()); } }
    
© www.soinside.com 2019 - 2024. All rights reserved.