用于公开可用操作的正确模式

时间:2017-10-20 12:54:37

标签: c# .net winforms mvvm command-pattern

我有一个类可以对给定对象执行许多分析并返回结果集:

public class AnalyserClass
{
    private SomeObject _someObject;

    public AnalyserClass(SomeObject someobject)
    {
        _someObject = someobject;
    }

    public IEnumerable<Result> DoA
    {
        //checks A on someObject and returns some results
    }

    public IEnumerable<Result> DoB
    {
        //checks B on someObject and returns some results
    }

    //etc

}

public class Result
{
    //various properties with result information
}

public class SomeObject
{
    //this is the object which is analysed
}

我想在WinForm的CheckedListBox中公开这些操作(DoA,DoB等)。然后,用户将勾选他/她想要执行的动作,然后单击“运行”按钮。

理想情况下,我希望将动作公开为动态 - 因此,如果我在AnalyserClass中开发一个新动作,它将自动显示并可以从WinForm中执行,而不会在其他地方进行任何代码更改。

我是一名相当新的C#程序员。我一直在研究如何最好地构建这个,并且我在各种模式之间变得有点混淆,哪一个最适合使用。

首先,我阅读了MVVM模式,但这似乎比这里要求的更复杂,我不明白模型会是什么。

然后我看了Command模式。但根据我的理解,我将不得不为每一个动作(有很多)创建一个类包装器,这将非常耗时并且看起来有点麻烦(在多个地方更改代码,所以不是'动态') 。我也不明白如何从命令类构建复选框列表。这似乎是我能找到的最合适的模式,但由于缺乏经验,我不确定。

非常感谢您的指导。

1 个答案:

答案 0 :(得分:2)

我不会在这里选择反思,因为它会使事情变得多么复杂。

此外,根据您当前的方法,每次需要新的分析工具时,您都需要使用新功能扩展AnalyserClass,并且:

  • 打破了SOLID的“开放式”原则,
  • 打破了SOLID的“单一责任”原则,
  • 让你的课程太大而且难以维护。

我会在您的AnalyserClass中介绍一系列支持的操作:

class AnalyserClass
{
    public IEnumerable<IAnalyzer> Analyzers { get; private set; }
}

... IAnalyzer界面描述了您的行为:

interface IAnalyzer
{
    string Description { get; }         // this is what user will see as the action name
    Result Perform(SomeObject input);
}

然后,您可以根据需要在各种类中实现IAnalyzer,即使在不同的模块中也是如此。

唯一的开放点是 - 如何将所有IAnalyzer个实例添加到您的AnalyzerClass.Analyzers集合中?

好:

  • 您可以使用DI框架(例如MEF)让它自动发现所有内容,
  • 您可以通过DI手动注射它们,
  • 您可以使用反射并手动扫描类型
  • 您可以手动添加它们,例如在AnalyzerClass的构造函数中(简单但不推荐)
  • 等......