Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何实现模块化系统_C#_Design Patterns_Architecture_Software Design - Fatal编程技术网

C# 如何实现模块化系统

C# 如何实现模块化系统,c#,design-patterns,architecture,software-design,C#,Design Patterns,Architecture,Software Design,我正在设计一个非常大的系统,我将用C和.NETFramework4.6.2实现,但我认为这与我的问题无关 这个系统将有模块,我可以使用它在一台计算机或不。例如,如果我使用我的系统跟踪摄像头读取的datamatrix,我将使用一个模块来读取datamatrix,但在另一个安装中,我不会安装该模块,因为我不会读取datamatrix 简单地说,我的系统将是一个windows桌面应用程序,有许多用户控件,如果这些功能可用,我可以使用这些控件来管理某些功能 所有这些模块都可以保存统计数据。例如,在使用摄

我正在设计一个非常大的系统,我将用C和.NETFramework4.6.2实现,但我认为这与我的问题无关

这个系统将有模块,我可以使用它在一台计算机或不。例如,如果我使用我的系统跟踪摄像头读取的datamatrix,我将使用一个模块来读取datamatrix,但在另一个安装中,我不会安装该模块,因为我不会读取datamatrix

简单地说,我的系统将是一个windows桌面应用程序,有许多用户控件,如果这些功能可用,我可以使用这些控件来管理某些功能

所有这些模块都可以保存统计数据。例如,在使用摄像头读取datamatrix的模块中,我想存储datamatrix的数量、一分钟读取的数量、错误的datamatrix读取等。这不是此模块的功能,因此我需要创建另一个模块来管理此统计信息

有时我会使用统计信息,但有时不会。因此,我需要一种机制来准备所有模块以使用统计信息模块:

添加对“统计方法”模块的调用以保存数据。 添加一种方法,将统计信息模块插入到另一个模块,并且不做任何其他操作来使用它。 简而言之,如果我在datamatrix模块中插入了统计模块,请添加一种使用该模块的方法,如果我没有插入该模块,请不要使用该模块

我需要做一些事情来准备datamatrix模块,以便在我插入的情况下使用统计模块,但如果我没有插入,请不要抛出任何错误

我认为我需要为统计模块实现一个接口,以及一种将该模块的实例添加到datamatrix模块的方法。并且,在使用datamatrix模块之前,检查统计模块是否可用


你觉得怎么样?有一种模式可以做这个吗?

我会这样做:

public interface IStatisticsModule {
    bool Enabled { get; }
    void Save(object stuff);
    // whatever else it can do
}

class NullStatistics : IStatisticsModule {
    public bool Enabled => false;

    public void Save(object stuff) {
        // do nothing or throw
    }
}

class RealStatisticsModule : IStatisticsModule {
    public bool Enabled => true;
    public void Save(object stuff) {
        // save
    }
}

public class DataMatrixModule {
    private readonly IStatisticsModule _stats;

    public DataMatrixModule(IStatisticsModule stats) {
        _stats = stats;
    }

    public void SomeOperation() {
        if (_stats.Enabled)
            _stats.Save(null);
    }
}
因此,您总是将IStatisticsModule注入其他模块,但当您不需要收集统计数据时,您会注入伪NullStatistics,该伪NullStatistics实现相同的接口,但不执行任何操作。还包括Enabled属性,以便模块可以决定在实际不需要时不执行昂贵的统计计算。若计算成本不高,那个么模块甚至可以省略IsEnabled检查,只调用相应的方法,若不需要统计信息,那个么该方法将什么都不做


这就是所有记录器的基本工作方式,它们有类似于Debug和IsDebugEnabled的功能,但您可以忽略IsDebugEnabled检查,只要调用Debug,如果该函数的参数在计算上不昂贵的话。如果禁用了调试,它将什么也不做。

您可能希望采用面向对象的方法,明确地说,对于统计信息,它们会生成一些静态类,并将它们放入库中。dll用于共享方法如果您的模块有接口,您只需为每个模块设置一个保存/加载并调用它