C#:关于应用程序结构的一些想法

本文关键字:结构 应用程序 | 更新日期: 2023-09-27 18:24:28

我有一个项目,现在正处于一个日益复杂的阶段,它迫使我思考它的结构。用几句话来解释:

  • 我有一个主应用程序作为UI。它允许用户运行不同的测试,并应显示状态更新和结果
  • 我有一大堆类,其中包含一些硬件上的不同测试。所有这些类都实现了iTest接口以确保兼容性

我现在的处境:我想更新状态(我现在没有)。我需要在测试类中激发某种StatusUpdate事件,并在我的UI中接收这些事件。我是代理和事件处理程序的新手,所以我不知道该选择哪种方式。按照这里的答案"如何将事件添加到类",意味着每次实例化一个测试类时,我都必须添加一个事件处理程序。这将生成大量冗余代码,我认为这些代码是不必要的。

我想在我的UI中有一个名为"StatusUpdateEventHandler(string textToDisplay)"的函数。哪个测试类调用此事件应该无关紧要。

有人能告诉我去哪里吗?非常感谢:)

C#:关于应用程序结构的一些想法

我将使用一个具有公共属性/方法/事件的基类向UI报告进度。很快,这就是我处理问题的方法:

创建事件处理程序以报告进度:

public delegate void StatusChangedEventHandler(object sender, StatusChangedEventArgs e);

创建一个抽象基类:

public abstract class TestBase:ITest
{
    // An event that clients can use to be notified whenever the
    // elements of the list change.
    public event StatusChangedEventHandler StatusChanged;
    protected virtual void OnStatusChanged(StatusChangedEventArgs e)
    {
        if (StatusChanged != null)
            StatusChanged(this, e);
    }
    protected virtual void ReportProgress (int percentage, string step)
    {
        OnStatusChanged(new StatusChangedEventArgs()
        {
            Percentage = percentage,
            Step = step
        });
    }
    public abstract void Execute();
}

创建一个EventArgs,用于从UI中的事件中获取数据:

public class StatusChangedEventArgs:EventArgs
{
    public int Percentage { get; set; }
    public string Step { get; set; }    
}

然后确保您的测试使用基本测试类:

public class SimpleTest : TestBase
{
    public override void Execute()
    {
        ReportProgress(10, "STEP 1");
        ReportProgress(25, "STEP 2");
        ReportProgress(55, "STEP 3");
        ReportProgress(70, "STEP 4");
        ReportProgress(100, "STEP 5");
    }
}

然后将事件连接到您的UI,下面是我在控制台应用程序中的实现:

class Program
{
    static void Main(string[] args)
    {
        SimpleTest simpleTest = new SimpleTest();
        simpleTest.StatusChanged += SimpleTest_StatusChanged;
        simpleTest.Execute();
        Console.ReadLine();
    }
    private static void SimpleTest_StatusChanged(object sender, StatusChangedEventArgs e)
    {
        Console.WriteLine($"{e.Percentage} - {e.Step}");
    }
}

我不能说你提供了很多信息来建议一个真正有用的回应。:-)在我看来,您似乎在寻找类似于通用事件的东西,请参阅文章中的示例。您应该订阅由测试单元触发的事件,因此相关字符串将与每个特定事件一起传递。此外,您可以考虑一些类层次结构来支持您的测试单元。

希望它能给你带来一些新的想法来寻找方向。