2017-04-06 109 views
1

我正在設計一個非常大的系統,我將用C#和.NET Framework 4.6.2實現(但我認爲這與我的問題無關)。如何實現模塊化系統

該系統將有我可以在一臺計算機中使用它的模塊。例如,如果我正在使用我的系統跟蹤攝像頭讀取的數據矩陣,我將使用一個模塊讀取datamatrix,但在另一個安裝中,我不打算安裝該模塊,因爲我不打算讀取數據矩陣。

簡而言之,我的系統將是一個帶有大量用戶控件的Windows桌面應用程序,如果這些功能可用,我可以使用它來管理某些功能。

所有這些模塊都可以保存統計數據。例如,在相機讀取數據矩陣的模塊中,我想存儲數據矩陣的數量,一分鐘內讀取多少個數據,讀取數據矩陣等。這不是該模塊的功能,所以我需要創建另一個模塊來管理這個統計。

有時我會使用統計,但有時沒有。因此,我需要一種機制來準備所有模塊以使用統計模塊:

  1. 添加對統計方法模塊的調用以保存數據。
  2. 添加一種方法將統計信息的模塊插入到另一個模塊中,不要做其他任何事情來使用它。

簡而言之,添加一種方法來使用統計模塊,如果我已經將它「插入」到datamatrix模塊中,並且不使用,如果我沒有插入它。

我需要做一些事情來準備datamatrix模塊來使用統計模塊,如果我插入了,但是如果我沒有插入,不要拋出任何錯誤。

我想我需要實現一個統計模塊的接口和一個將該模塊的實例添加到datamatrix模塊的方法。並且,在datamatrix模塊上,在使用之前檢查統計模塊是否可用。

您認爲如何?有沒有一種模式可以做到這一點?

+1

您可能想要採用OOP方法,絕對是統計信息,並且它們會爲您的共享方法制作一些靜態類並將其放入一個庫(.dll)中 – Jpsh

+0

如果您的模塊具有接口,則只需設置保存/爲每個加載並調用它 – BugFinder

回答

1

我會做這樣的:

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它實現了相同的接口,但不沒有。還包括Enabled屬性,以便模塊在不需要時可以決定不執行昂貴的統計計算。如果計算並不昂貴 - 模塊甚至可以省略IsEnabled檢查,只調用相應的方法,如果不需要統計信息,它將不會執行任何操作。

這是本質的所有記錄器是如何工作的,他們有像Debug()IsDebugEnabled,但你可以省略IsDebugEnabled檢查並調用Debug()如果參數傳遞給函數不計算成本。如果調試被禁用 - 它將不會執行任何操作。