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

时间:2015-11-26 14:28:51

标签: c#

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

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

我现在的位置:我希望有状态更新(我现在不知道)。我需要在Test-Classes中触发某种StatusUpdate-Event并在我的UI中接收这些事件。我是代表和事件处理程序的新手,所以我不知道哪种方式最适合这个。按照这里的答案" How to add an event to a class"意味着我每次实例化我的一个测试类时都必须添加一个事件处理程序。这将产生一大堆冗余代码,我认为这是不必要的。

我希望在我的UI中有一个名为sth的函数。喜欢" StatusUpdateEventHandler(string textToDisplay)"。无关紧要,哪个Test-Class调用此事件。

任何人都可以给我一些方向去哪儿吗?非常感谢:)

2 个答案:

答案 0 :(得分:1)

我将使用具有公共属性/方法/事件的基类来将进度报告回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}");
    }
}

答案 1 :(得分:0)

我无法说你提供了很多信息来提出真正有用的回复。 :-)在我看来,你寻找像generic events这样的东西,参见文章中的例子。您订阅了测试单元触发的事件,因此相关字符串将与每个特定事件一起传递。此外,您可以考虑使用某些类层次结构来支持您的测试单元。

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