C# 如何实现模块化系统
我正在设计一个非常大的系统,我将用C和.NETFramework4.6.2实现,但我认为这与我的问题无关 这个系统将有模块,我可以使用它在一台计算机或不。例如,如果我使用我的系统跟踪摄像头读取的datamatrix,我将使用一个模块来读取datamatrix,但在另一个安装中,我不会安装该模块,因为我不会读取datamatrix 简单地说,我的系统将是一个windows桌面应用程序,有许多用户控件,如果这些功能可用,我可以使用这些控件来管理某些功能 所有这些模块都可以保存统计数据。例如,在使用摄像头读取datamatrix的模块中,我想存储datamatrix的数量、一分钟读取的数量、错误的datamatrix读取等。这不是此模块的功能,因此我需要创建另一个模块来管理此统计信息 有时我会使用统计信息,但有时不会。因此,我需要一种机制来准备所有模块以使用统计信息模块: 添加对“统计方法”模块的调用以保存数据。 添加一种方法,将统计信息模块插入到另一个模块,并且不做任何其他操作来使用它。 简而言之,如果我在datamatrix模块中插入了统计模块,请添加一种使用该模块的方法,如果我没有插入该模块,请不要使用该模块 我需要做一些事情来准备datamatrix模块,以便在我插入的情况下使用统计模块,但如果我没有插入,请不要抛出任何错误 我认为我需要为统计模块实现一个接口,以及一种将该模块的实例添加到datamatrix模块的方法。并且,在使用datamatrix模块之前,检查统计模块是否可用C# 如何实现模块化系统,c#,design-patterns,architecture,software-design,C#,Design Patterns,Architecture,Software Design,我正在设计一个非常大的系统,我将用C和.NETFramework4.6.2实现,但我认为这与我的问题无关 这个系统将有模块,我可以使用它在一台计算机或不。例如,如果我使用我的系统跟踪摄像头读取的datamatrix,我将使用一个模块来读取datamatrix,但在另一个安装中,我不会安装该模块,因为我不会读取datamatrix 简单地说,我的系统将是一个windows桌面应用程序,有许多用户控件,如果这些功能可用,我可以使用这些控件来管理某些功能 所有这些模块都可以保存统计数据。例如,在使用摄
你觉得怎么样?有一种模式可以做这个吗?我会这样做:
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用于共享方法如果您的模块有接口,您只需为每个模块设置一个保存/加载并调用它