Отношения агрегации и создание экземпляров объектов из хранилища базы данных (vb) - PullRequest
0 голосов
/ 05 мая 2010

У меня есть небольшое приложение, которое позволяет пользователям создавать учетные записи, а затем начислять «очки» друг другу. UserAccount - это объект, как и Point, и между ними существует взаимосвязь агрегации: каждый UserAccount имеет переменную-член (PointHistory), которая представляет собой набор Points.

Объект Point просто содержит свойства, для которых объект UserAccount отправил / получил Point.

Это было нормально, когда я просто сериализовал классы, чтобы сохранить мою объектную модель. Однако сейчас я реализую базу данных для сохранения данных объекта, и только один / несколько объектов будут загружены в память в любой момент времени. Чтобы загрузить объекты, у меня есть метод конструктора, который создает новый UserAccount из строки в базе данных, и аналогичный конструктор для создания точки из строки базы данных. Вот тут и начинается проблема - как конструктор для одного объекта может вызвать конструктор для другого объекта, когда второй конструктор должен ссылаться на то, что первый конструктор еще не построил? Чтобы завершить строительство, объект должен быть уже построен.

Простое решение - просто заменить набор объектов Point (PointHistory) набором строк, извлеченных из запроса к базе данных. Этого достаточно для моих целей. Однако мне интересно, есть ли другой способ сделать то, что не оставляет объект / объектную модель Point, и является ли эта проблема агрегации / постоянства распространенной?

1 Ответ

0 голосов
/ 06 мая 2010

Если я правильно понимаю, конструктор UserAccount должен построить точки, которые принадлежат этому UserAccount, и этим точкам нужен способ ссылки на UserAccount, который в настоящее время находится в стадии разработки?

Если это так, вы можете передать Me в конструктор Point, который фактически передаст созданный UserAccount. Он будет передавать объект UserAccount, даже если строительство еще не завершено.

Class UserAccount

   Private _pointHistory As New System.Collections.Generic.List(Of MyProject.Point)

    Public Sub New()
       ...
       ...

       ' Instantiate a new point, and pass this UserAccount object into it 
       ' so that it can grab a reference
       Dim newPoint as New MyProject.Point(Me) 

       'Add the Point to this UserAccount's collection
       _pointHistory.Add(newPoint)

    End Sub

End Class


Class Point

    Private _parentAccount as MyProject.UserAccount

    Public Sub New(parentAccount as MyProject.UserAccount)

        'Store the reference to the User Account
        _parentAccount = parentAccount

    End Sub

End Class
...