你可以做的一件事是爲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語法來相應地修改這個答案更好地解決這個問題。)
我按照您的要求添加了VB。 – chrissie1
@ chrissie1:謝謝!我同意你的答案,使用DI。 (我個人的首選工具就是StructureMap。)兩者的結合也可以,只需在DI容器中調用'new DatabaseManager()'來解析依賴。當DI容器被抽象到服務定位器後面時,我特別喜歡這樣做,以防以後的IoC實現不支持構造器注入或setter注入等。當然,與其他任何東西一樣,有很多方法可以採用。 – David
yup,工廠與DI/IoC一起放置。 – chrissie1