vb.net - 从另一个类访问一个已启动的类

时间:2011-10-09 10:27:14

标签: database vb.net class

我在" Form1"中定义了以下内容:

 Dim Database As New DatabaseManager

这样我就可以在主窗体的任何地方访问我的所有数据库函数了(数据库连接是通过DatabaseManager类中的" private sub new()"函数初始化的。

这对于在form1中完成的所有查询都很好,但是我还有许多其他类,我希望能够从中访问数据库。

有人知道如何在我的示例中访问已启动的类吗?从现在开始,它以主窗体启动,如果我尝试访问任何其他类函数内的任何函数,它什么都不做(也不会出错)。

我试图弄清楚如何调整一堂课,我可以在任何课程中访问它,我无法弄明白。

谢谢!

3 个答案:

答案 0 :(得分:2)

如果你愿意,我会鼓励使用依赖注入。

从本质上讲,它将归结为此。

Private _DatabaseManager as DatabaseManager

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

如果您这样做,您可以为所有表单提供相同的DatabaseManager或不同的表单。

当然还有很多东西。但为此你必须深入研究Dependecy Injection和Inversion of control(DI / IoC)

答案 1 :(得分: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语法的人来编辑这个答案,以便更好地解决这个问题。)

答案 2 :(得分:-1)

在您的Form1中创建并启动databaseManager,但声明Friend而不是Dim。这样你就可以像下面这样写一个引用:Form1.databaseManager