0

ユーザーがアカウントを作成し、お互いに「ポイント」を与えることができる小さなアプリケーションがあります。UserAccount はオブジェクトであり、Point もオブジェクトであり、それらの間には集約関係があります。各 UserAccount には、Point のコレクションであるメンバー変数 (PointHistory) があります。

Point オブジェクトには、UserAccount オブジェクトが Point を送受信したプロパティが含まれているだけです。

オブジェクト モデルを永続化するためにクラスを単純にシリアル化したときは、これで問題ありませんでした。ただし、現在、オブジェクト データを永続化するためにデータベースを実装しており、一度に 1 つまたはいくつかのオブジェクトのみがメモリに読み込まれます。オブジェクトをロードするために、データベースの行から新しい UserAccount を作成するコンストラクター メソッドと、データベースの行から Point を作成する同様のコンストラクターがあります。これが問題の始まりです。最初のコンストラクターがまだ構築していないものを2 番目のコンストラクターが参照する必要がある場合、あるオブジェクトのコンストラクターが別のオブジェクトのコンストラクターを呼び出すにはどうすればよいでしょうか。構築を完了するには、オブジェクトがすでに構築されている必要があります。

簡単な解決策は、Point オブジェクトのコレクション (PointHistory) を、データベース クエリから取得した文字列のコレクションに置き換えるだけです。これは私の目的には十分です。ただし、Point オブジェクト/オブジェクト モデルを放棄しない別の方法があるかどうか、また、この集約/永続性の問題が一般的かどうか疑問に思っています。

4

1 に答える 1

0

私の理解が正しければ、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
于 2010-05-06T00:07:19.533 に答える