c# - 公开可用操作的正确模式

标签 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 等)。然后,用户将勾选他/她想要执行的操作,然后单击“运行”按钮。

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

我是一个相当新的 C# 程序员。我一直在研究如何最好地构建它,我对各种模式以及最适合使用的模式有点困惑。

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

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

非常感谢您的指导。

最佳答案

我不会在这里选择反射,因为它使事情变得不必要的复杂。

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

  • 打破了SOLID的“开闭”原则,
  • 打破了SOLID的“单一责任”原则,
  • 使您的类(class)太大且难以维护。

  • 我会在您的 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 手动注入(inject)它们,
  • 您可以使用反射并手动扫描类型,
  • 您可以手动添加它们,例如在 AnalyzerClass 的构造函数中(简单但不推荐)
  • 等等...
  • 关于c# - 公开可用操作的正确模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46849517/

    相关文章:

    c# - 将子列表转换为父类型列表

    c# - 在C#中连接到Udp服务器的客户端列表

    c# - 使用VS 2005设计抽象形式

    c# - Windows 窗体泛型继承

    c# - 客户端IP地址返回相同的内网地址

    c# - 在数组中获取 9 个不同数字的算法

    c# - 反序列化为正确的子对象

    C#复制构造函数生成器

    c# - 带有 ASMX Web 服务的 Web 服务器上的后台进程

    c# - 在 C# 中构建流畅的动画