Получить информацию из высшего класса? - PullRequest
3 голосов
/ 02 июня 2010

Я не знаю, как правильно сформулировать вопрос, поэтому, пожалуйста, потерпите меня ...

У меня есть 3 класса: сервер, база данных и таблица. Каждый класс имеет свойство «Имя». Как я хочу, чтобы это работало, так это то, что на каждом сервере может быть несколько баз данных, и каждая база данных может иметь несколько таблиц. Так что в классе Server у меня есть это свойство.

Private _databases As List(Of Database)
Public Property Databases() As List(Of Database)
    Get
        Return _databases
    End Get
    Set(ByVal value As List(Of Database))
        _databases = value
    End Set
End Property

И у меня есть нечто похожее в классе Database для таблиц. Теперь это работает нормально, потому что я могу сделать что-то подобное, чтобы получить все базы данных на сервере.

For Each db In s.Databases 's being the server object
        Debug.Print(db.Name)

    Next

Я хотел бы расширить эти классы. Я хочу, чтобы класс сервера обрабатывал всю информацию о соединении, и я хотел бы, чтобы другие классы использовали в них информацию о соединении класса сервера.

Например, я устанавливаю класс сервера и задаю строку подключения к серверу. Затем я хочу, чтобы класс базы данных использовал свойство serverclass.connectionstring для подключения к серверу и получения списка всех баз данных. Но я хочу сохранить этот код в классе базы данных. Как я могу это сделать?

Я приложил код того, что я хочу сделать.

Public Class Server

Private _name As String
Public Property Name() As String
    Get
        Return _name
    End Get
    Set(ByVal value As String)
        _name = value
    End Set
End Property


Private _databases As List(Of Database)
Public Property Databases() As List(Of Database)
    Get
        Return _databases
    End Get
    Set(ByVal value As List(Of Database))
        _databases = value
    End Set
End Property
End Class

'-----New class  

Public Class Database

Private _name As String
Public Property Name() As String
    Get
        Return _name
    End Get
    Set(ByVal value As String)
        _name = value
    End Set
End Property


Private _tables As List(Of Table)
Public Property Tables() As List(Of Table)
    Get
        Return _tables
    End Get
    Set(ByVal value As List(Of Table))
        _tables = value
    End Set
End Property

'This is where I need help!
Private Sub LoadTables () 
    dim connectionstring as string = server.connectionstring 'Possible?

    'Do database stuff
End Class

Спасибо за чтение!

Ответы [ 3 ]

2 голосов
/ 02 июня 2010

Вы должны будете включить ссылку на класс «владелец» в свой дочерний класс.

Без использования кода (для краткости) у вас есть прямо сейчас

Server
----------
Databases   -----> Database
Name               ------------
                   Tables       -----> Table
                   Name                --------------
                                       Name

То, что вы хотите , выглядит примерно так:

Server
----------
Databases   -----> Database
Name               ------------
  ^                Tables       -----> Table
  |                Name                --------------
   --------------- Server              Name
                     ^                 Database
                     |-------------------|

Свойство Server класса Database и свойство Database класса Table предназначены для ссылки на экземпляр каждого из них, которому они принадлежат.

1 голос
/ 02 июня 2010

Я бы лично уведомил базу данных о сервере, на котором она хранится, чтобы база данных знала, куда подключаться, в зависимости от того, какой сервер ей предоставлен.

Это будет выглядеть примерно так:

public class Database {
    public Database(Server server) {
        Server = server;
    }

    public Server Server { get; private set; }
}
1 голос
/ 02 июня 2010

Передача сервера в базу данных при его создании и установка поля. Это очень базовая форма внедрения зависимости .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...