2011-10-09 49 views
0

我有以下的在我的「Form1的」定義的另一個類訪問的啓動類:vb.net - 從

Dim Database As New DatabaseManager 

所以,我可以訪問所有我的數據庫功能,在主窗體的任何地方(數據庫連接通過DatabaseManager類中的「private sub new()」函數初始化。

對於在form1中完成的所有查詢都可以正常工作,但是我有很多其他類,我希望能夠從中訪問數據庫

有誰知道如何訪問啓動的類在我的例子?因爲現在它是以主表單啓動的,如果我嘗試訪問任何其他類函數內部的任何函數,它什麼也不做(不會出錯)。

我想要弄清楚如何模糊一個類,我可以從任何類中訪問它,我無法弄清楚它。

謝謝!

回答

1

你可以做的一件事是爲DatabaseManager創建一個工廠,然後讓所有其他代碼從該工廠調用它。我非常出與VB語法練習,但在C#這可能是這個樣子:

public class DatabaseManagerFactory 
{ 
    private static DatabaseManager _current = null; 

    public static DatabaseManager Current 
    { 
     get 
     { 
      if (_current == null) _current = new DatabaseManager(); 
      return _current; 
     } 
    } 
} 

VB

Public Class DatabaseManagerFactory 
    Private Shared _current As DatabaseManager = Nothing 

    Public Shared ReadOnly Property Current As DatabaseManager 
     Get 
      If _current Is Nothing null Then _current = New DatabaseManager() 
      Return _current 
     End Get 
    End Property 
End Class 

的想法則是,在應用程序中的任何一個需要使用DatabaseManager只會調用DatabaseManagerFactory.Current來獲取一個共享實例。

請注意,在這種情況下,DatabaseManager並不是一個單身人士,如果您出於某種原因需要,您仍然可以在應用程序的其他地方實例化一個人。如果它應該是一個真正的單身人士,那麼你會想對DatabaseManager類本身進行一些修改。也許給它一個私人的構造函數,並直接在類上實現這個工廠?事情是這樣的:

public class DatabaseManager 
{ 
    private static DatabaseManager _current = null; 

    public static DatabaseManager Current 
    { 
     get 
     { 
      if (_current == null) _current = new DatabaseManager(); 
      return _current; 
     } 
    } 

    private DatabaseManager 
    { 
     // your initialization of the class 
    } 
} 

VB

Public Class DatabaseManager 
    Private Shared _current DatabaseManager = Nothing 

    Public Shared ReadOnly Property Current As DatabaseManager 
     Get 
      If _current Is Nothing Then _current = New DatabaseManager() 
      Return _current 
     End Get 
    End Property 

    Private Sub New() 
     ' your initialization of the class 
    End Sub 
End Class 

(我鼓勵任何人都更熟悉VB語法來相應地修改這個答案更好地解決這個問題。)

+1

我按照您的要求添加了VB。 – chrissie1

+0

@ chrissie1:謝謝!我同意你的答案,使用DI。 (我個人的首選工具就是StructureMap。)兩者的結合也可以,只需在DI容器中調用'new DatabaseManager()'來解析依賴。當DI容器被抽象到服務定位器後面時,我特別喜歡這樣做,以防以後的IoC實現不支持構造器注入或setter注入等。當然,與其他任何東西一樣,有很多方法可以採用。 – David

+0

yup,工廠與DI/IoC一起放置。 – chrissie1

-1

創建並啓動databaseManager您Form1,但聲明Friend而不是Dim。這樣,你可以寫一個參考它:Form1.databaseManager

2

我會鼓勵使用依賴注入,如果你想這樣做。

實質上它會歸結爲此。

Private _DatabaseManager as DatabaseManager 

Public Sub New(Byval DatabaseManager as DatabaseManager) 
    InitializeComponent() 
    _DatabaseManager = DatabaseManager 
End Sub 

如果你這樣做,你可以給你所有的表單使用相同的DatabaseManager或者像你這樣的其他人。

當然,除此之外還有更多。但爲此,您將不得不深入研究依賴注入和控制反轉(DI/IoC)