C#:关于应用程序结构的一些想法
本文关键字:结构 应用程序 | 更新日期: 2023-09-27 18:24:28
我有一个项目,现在正处于一个日益复杂的阶段,它迫使我思考它的结构。用几句话来解释:
- 我有一个主应用程序作为UI。它允许用户运行不同的测试,并应显示状态更新和结果
- 我有一大堆类,其中包含一些硬件上的不同测试。所有这些类都实现了iTest接口以确保兼容性
我现在的处境:我想更新状态(我现在没有)。我需要在测试类中激发某种StatusUpdate事件,并在我的UI中接收这些事件。我是代理和事件处理程序的新手,所以我不知道该选择哪种方式。按照这里的答案"如何将事件添加到类",意味着每次实例化一个测试类时,我都必须添加一个事件处理程序。这将生成大量冗余代码,我认为这些代码是不必要的。
我想在我的UI中有一个名为"StatusUpdateEventHandler(string textToDisplay)"的函数。哪个测试类调用此事件应该无关紧要。
有人能告诉我去哪里吗?非常感谢:)
我将使用一个具有公共属性/方法/事件的基类向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}");
}
}
我不能说你提供了很多信息来建议一个真正有用的回应。:-)在我看来,您似乎在寻找类似于通用事件的东西,请参阅文章中的示例。您应该订阅由测试单元触发的事件,因此相关字符串将与每个特定事件一起传递。此外,您可以考虑一些类层次结构来支持您的测试单元。
希望它能给你带来一些新的想法来寻找方向。