2010-06-14 40 views
1

我正在開發一個項目,並且希望可以選擇使用程序集(如果有的話)。這個程序集僅在WS 2008 R2上可用,而我的理想產品對於有和沒有程序集的計算機都是常見的二進制程序。但是,我主要是在Windows 7機器上開發的,我無法安裝程序集。
如何組織我的代碼,以便我可以(通過最少更改)在沒有程序集的機器上構建我的代碼,其次,我如何確保僅在存在時調用程序集函數。
(注意:可選程序集的唯一用途是在庫中實例化一個類,並重復調用該類的(單個)函數,該函數返回一個布爾值。程序集是fsrmlib,它顯示高級文件系統管理操作WS08R2。)
我目前正在考慮編寫一個包裝類,如果程序集不存在,它將始終返回true。這是做這件事的正確方法嗎?如何使用可選裝配參考來組織代碼?

回答

3

我的方法是動態加載程序集,而不是硬編碼引用。您的代碼然後可以決定是否使用程序集(如果它加載)或返回一些其他值。如果使用程序集,則需要使用反射來實例化類並使用該方法。這樣你的代碼將在任何平臺上構建和運行,但是如果它檢測到fsrmlib的存在,它的行爲將會改變。

System.Reflection.Assembly文檔有example code for doing this

+0

如果我動態加載引用,那麼使用引用的代碼將如何編譯?編譯器應該知道引用中類的存在。 – apoorv020 2010-06-14 09:10:14

+0

@ apoorv020,更新了我的答案以指向示例代碼。 – 2010-06-14 12:22:28

2

隱藏接口背後的功能,說:

public interface IFileSystemManager 
{ 
    void Manage(IFoo foo); 
} 

創建兩種實現方式:

  • 一個包裝從fsrmlib
  • 一個Null Object實現,什麼都不做
  • 所需的功能的實現

注入IFileSystemManager到使用構造器注入你的消費者:

public class Consumer 
{ 
    private readonly IFileSystemManager fileSystemManager; 

    public Consumer(IFileSystemManager fileSystemManager) 
    { 
     if (fileSystemManager == null) 
     { 
      throw new ArgumentNullException("fileSystemManager"); 
     } 

     this.fileSystemManager = fileSystemManager; 
    } 

    // Use the file system manager... 
    public void Bar() 
    { 
     this.fileSystemManager.Manage(someFoo); 
    } 
} 

通過委派從IFileSystemManager映射到具體類的配置文件,這樣就可以改變實現而無需重新編譯應用程序配置選項使IFileSystemManager的選擇。

配置在WS 2008 R2上運行的應用程序使用包裝fsrmlib的實現,並將所有其他應用程序配置爲使用Null Object實現。

我建議您使用DI容器作爲配置部件,而不是自己滾動此功能。

或者,您也可以考慮將IFileSystemManager作爲加載項,並使用MEF爲您進行連線。

+0

我目前的方法與您所描述的方法類似,函數返回的布爾值用於決定是否應執行某些操作(因此,只要FSRM不存在,我就返回true)。至於使用配置文件,我希望以某種方式動態檢測庫的存在。 – apoorv020 2010-06-14 09:16:07