2013-09-23 67 views
1

我想我已經在這裏畫了一個角:讓我說我有一堆代碼,我在多個項目中使用,所以我把它放在命名空間Company從外部訪問內部命名空間不知道內部名稱

然後所有項目特定的代碼在Company.Project。然後,我可以調用庫中的代碼 - 外部命名空間 - 從項目命名空間,而不必指定命名空間 - 它是隱式導入的。精細。

但是,說我有一些代碼,我在所有的項目中使用,但是按項目逐項實施。爲了舉例,假設我有一個診斷窗口和代碼,我可以在WPF或Winforms中實現,或者爲每個項目使用不同的外觀和感覺。由於它是按項目逐個實現的,因此它不能進入​​Company命名空間,但是當它位於項目命名空間中時,我只能通過指定內部命名空間來從Company命名空間調用它 - 這對每個項目都是不同的。

我想我可以使用代表來解決這個問題,但它似乎凌亂 - 有沒有更簡單的方法?

+1

你有一個項目特定的控制,你想在其他項目中重用?對不起,我不清楚,我不明白你想要做什麼。 – BrunoLM

回答

1

聽起來你需要某種IoC並使用接口來解決這個問題。這裏有一個沒有任何特殊庫的簡單程序:

// In your shared project 
namespace Company { 
    public interface IDiagnosticWindow { 
     void ShowMessage(string message); 
    } 

    public static class Utilities { 

     private static IDiagnosticWindow _diagnosticWindow; 

     public static void InitializeDiagnosticWindow(IDiagnosticWindow dw) { 
      _diagnosticWindow = dw; 
     } 

     public static void ShowMessage(string message) { 
      _diagnosticWindow.ShowMessage(message); 
     } 
    } 
} 

// In your WinForms project 
namespace Company.WinForms { 
    public class WinFormsDiagnosticWindow : IDiagnosticWindow { 
     public void ShowMessage(string message) { 
      MessageBox.Show(message); 
     } 
    } 

    static void Main() { 
     Utilities.InitializeDiagnosticWindow(new WinFormsDiagnosticWindow()); 
    } 
} 

對於其他應用程序類似地實現它。在這個例子中,在應用程序的開始處手動初始化這一點很重要。但是如果你在Main中這樣做,那麼這將被初始化,並且Utilities.ShowMessage將可用於核心項目或應用程序項目中。

像Ninject這樣的圖書館也可以通過把這種關係更好地結合起來來幫助你。

+0

我正在模糊地摸索這個,但不能完全到達那裏 - 這個代碼使它落到了位置 – peterG

4

也許使用接口?在你的Company命名空間中定義接口。然後讓每個項目都實現接口。然後使用Company命名空間中的接口。

此方法的一個缺點是仍然需要某個類創建接口實現的項目特定實例。就像某種需要引用Company名稱空間和實現它的項目特定類的工廠。

相關問題