【问题标题】:vb.net - accessing an initiated class from another classvb.net - 从另一个类访问已启动的类
【发布时间】:2011-10-09 10:27:13
【问题描述】:

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

 Dim Database As New DatabaseManager

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

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

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

我正在尝试弄清楚如何调暗一个类,我可以从任何类中访问它,但我无法弄清楚。

谢谢!

【问题讨论】:

    标签: database vb.net class


    【解决方案1】:

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

    本质上它会归结为这个。

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

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

    当然还有很多。但为此,您将不得不深入研究依赖注入和控制反转 (DI/IoC)

    【讨论】:

      【解决方案2】:

      您可以做的一件事是为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:谢谢!我也同意你的回答,使用 DI。 (我个人选择的工具是 StructureMap。)两者的混合也可以,只需将我的 new DatabaseManager() 替换为调用 DI 容器以解决依赖关系。我特别喜欢在服务定位器后面抽象 DI 容器时这样做,以防以后的 IoC 实现不支持构造函数注入或 setter 注入等。当然,与任何事情一样,有很多方法可以采用。
      • 是的,工厂与 DI/IoC 一起占有一席之地。
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2011-04-02
        • 2012-05-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多