ビジネスオブジェクトに値を割り当てる
この時点でアプリケーションを実行しても、何も表示されません。コントロールはプロパティにバインドされていますが、プロパティに値がないのです。そこで、ビジネスオブジェクトに値を割り当てることが、オブジェクトバインディングの次の大きなステップになります。
データを取得してビジネスオブジェクトに割り当てるには、さまざまな方法があります。例えば、DataSetまたはDataTableを使用する方法や、Webサービスを使って必要なデータを取得する方法があります。また、TableAdaptersを使って、プロパティをデータベースフィールドにバインドする方法もあります。
話を簡単にするために、ビジネスオブジェクトのプライベートなRetrieveメソッドを使って、必要なデータを取得することにします。実際には、ADO.NETを使ってコード内でDataTableを作成します。この方法の場合、オブジェクトバインディングを試みるのに、データベース、ストアドプロシージャ、またはWebサービスを作成する必要がありません。リスト1は、VBコードのRetrieveメソッドです。リスト2は、C#のRetrieveメソッドです。
Private Function Retrieve(ByVal CustomerID As Int32) As DataRow Dim dt As New DataTable ' Define the columns dt.Columns.Add("CustomerID") dt.Columns.Add("LastName") dt.Columns.Add("FirstName") Select Case CustomerID Case 1 dt.Rows.Add(1, "Einstein", "Albert") Case 2 dt.Rows.Add(2, "Curie", "Marie") Case 3 dt.Rows.Add(3, "Brahe", "Tycho") Case 4 dt.Rows.Add(4, "Faraday", "Michael") End Select Return dt.Rows(0) End Function
private DataRow Retrieve(Int32 CustomerID) { DataTable dt = new DataTable(); // Define the columns dt.Columns.Add("CustomerID"); dt.Columns.Add("LastName"); dt.Columns.Add("FirstName"); switch (CustomerID) { case 1: dt.Rows.Add(1, "Einstein", "Albert"); break; case 2: dt.Rows.Add(2, "Curie", "Marie"); break; case 3: dt.Rows.Add(3, "Brahe", "Tycho"); break; case 4: dt.Rows.Add(4, "Faraday", "Michael"); break; } return dt.Rows[0]; }
ベストプラクティスでは、Factoryパターンを使ってビジネスオブジェクトを作成し、これに取得データを割り当てます。Factoryパターンを実装するには、さまざまな方法があります。今回の例では、次に示すように、Factoryパターンの実装によってコンストラクタをプライベートにし(これで他のコードはオブジェクトを作成できなくなります)、インスタンスの作成と値の割り当てを行う静的な(共有の)Createメソッドを定義します。
Private Sub New() ' Don't allow creation of this object End Sub Public Shared Function Create(ByVal CustomerID _ As Int32) As Customer ' Create the customer Dim oCustomer As New Customer ' Retrieve the data for this customer Dim dr As DataRow dr = oCustomer.Retrieve(CustomerID) ' Populate the business object oCustomer.Populate(dr) Return oCustomer End Function
private Customer() { // Don't allow creation of this object } public static Customer Create(Int32 CustomerID) { // Create the customer Customer oCustomer = new Customer(); // Retrieve the data for this customer DataRow dr =oCustomer.Retrieve(CustomerID); // Populate the business object oCustomer.Populate(dr); return oCustomer; }
実際にビジネスオブジェクトへの値の割り当てを行うメソッドは、次のようになります。
Private Sub Populate(ByVal CustomerDataRow As _ DataRow) With CustomerDataRow Me.LastName = .Item("LastName").ToString Me.FirstName = .Item("FirstName").ToString Me.CustomerID = .Item("CustomerID").ToString End With End Sub
private void Populate(DataRow CustomerDataRow) { this.LastName = CustomerDataRow["LastName"].ToString(); this.FirstName = CustomerDataRow["FirstName"].ToString(); this.CustomerID = Convert.ToInt32(CustomerDataRow["CustomerID"]); }
ビジネスオブジェクトにプロパティを追加するたびに、Populateメソッドのコードを拡張する必要があります。型指定されていないDataSet、DataReader、または他の方法を使用するのではなく、TableAdapterまたは型指定されたDataSetを使ってデータを取得する場合は、引用符で囲まれた文字列の列名の代わりに、自動的に生成された厳密に型指定された名前を使って、データ列を参照します。
オブジェクトバインディングを完成させるには、フォームのLoadイベントに、オブジェクトの作成とバインドを行うコードを追加します。具体的には、次のようにCreateメソッドを呼び出してオブジェクトのインスタンスを作成し、そのインスタンスにCustomerBindingSourceを代入してバインドします。
Private Sub CustomerWin_Load(ByVal sender As _ Object, ByVal e As System.EventArgs) _ Handles Me.Load Dim CustomerInstance As Customer CustomerInstance = Customer.Create(1) CustomerBindingSource.DataSource = CustomerInstance End Sub
private void CustomerWin_Load(object sender, EventArgs e) { Customer CustomerInstance = Customer.Create(1); customerBindingSource.DataSource = CustomerInstance; }
この時点で、アプリケーションを実行できます。問題がなければ、フォームが表示され、そのフォーム上のコントロールにプロパティ値がテキストとして表示されます。
