Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database vb.net-从另一个类访问已启动的类_Database_Vb.net_Class - Fatal编程技术网

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

Database vb.net-从另一个类访问已启动的类,database,vb.net,class,Database,Vb.net,Class,我在“表格1”中定义了以下内容: 这样我就可以在主窗体的任何位置访问所有数据库函数(数据库连接是通过DatabaseManager类中的“private sub new()”函数初始化的) 对于在form1中完成的所有查询,该类都可以正常工作,但是我还有许多其他类希望能够从中访问数据库 在我的示例中,有人知道如何访问已启动的类吗?因为现在它是以主窗体启动的,如果我尝试访问任何其他类函数中的任何函数,它将不会执行任何操作(也不会出错) 我试图弄清楚如何调暗一级,我可以从任何一个类中访问它,但我弄不

我在“表格1”中定义了以下内容:

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

对于在form1中完成的所有查询,该类都可以正常工作,但是我还有许多其他类希望能够从中访问数据库

在我的示例中,有人知道如何访问已启动的类吗?因为现在它是以主窗体启动的,如果我尝试访问任何其他类函数中的任何函数,它将不会执行任何操作(也不会出错)

我试图弄清楚如何调暗一级,我可以从任何一个类中访问它,但我弄不清楚


谢谢!

您可以做的一件事是为
数据库管理器创建一个工厂,然后让您的所有其他代码从该工厂调用它。我非常不习惯使用VB语法,但在C中,它可能看起来像这样:

public class DatabaseManagerFactory
{
    private static DatabaseManager _current = null;

    public static DatabaseManager Current
    {
        get
        {
            if (_current == null) _current = new DatabaseManager();
            return _current;
        }
    }
}
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

这样一来,应用程序中需要使用
DatabaseManager
的任何内容都只需调用
DatabaseManagerFactory.Current
即可获得一个共享实例

请注意,在这种情况下,
DatabaseManager
并不是一个真正的单例,如果出于某种原因需要,您仍然可以在应用程序的其他地方实例化一个。如果它应该是一个实际的单例,那么您需要对
DatabaseManager
类本身进行一些修改。可能会给它一个私有构造函数并实现它是否直接在课堂上使用此工厂?类似于:

public class DatabaseManagerFactory
{
    private static DatabaseManager _current = null;

    public static DatabaseManager Current
    {
        get
        {
            if (_current == null) _current = new DatabaseManager();
            return _current;
        }
    }
}
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


(我鼓励任何更熟悉VB语法的人相应地编辑此答案,以便更好地解决问题。)

在表单1中创建并启动
databaseManager
,但是声明它为
Friend
,而不是
Dim
。这样你就可以编写一个对它的引用,比如:
Form1.databaseManager
如果你想要的话,我鼓励你使用依赖注入

从本质上讲,它可以归结为这一点

Private _DatabaseManager as DatabaseManager

Public Sub New(Byval DatabaseManager as DatabaseManager)
  InitializeComponent()
  _DatabaseManager = DatabaseManager
End Sub
t如果你这样做,你可以给你所有的表单一个相同的数据库管理器或一个不同的数据库管理器


当然还有很多。但是你必须深入研究依赖注入和控制反转(DI/IoC)

我按照你的要求添加了VB。@克里斯1:谢谢!我也同意你的答案,使用DI。(我个人选择的工具是StructureMap。)这两种方法的混合使用也可以,只需替换新的DatabaseManager()
在我的例子中,我调用DI容器来解决依赖关系。当DI容器被抽象到服务定位器后面时,我特别喜欢这样做,以防以后的IoC实现不支持构造函数注入或setter注入等。当然,与其他方法一样,有很多方法可以采用。是的,factores与DI/IoC共同占有一席之地。
Private _DatabaseManager as DatabaseManager

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