この特集のトップページへ
Chapter 6:ビジネスロジックの設計

head2.gif 6.3.1 新規製品の登録
 製品を新規登録する方法は,顧客を新規登録する方法とほぼ同じである。対象となるのテーブルが,顧客情報テーブルなのか,それとも製品情報テーブルなのか,という点だけが異なる。

●データオブジェクトの構築
 このサンプルでは,製品情報テーブルを操作するデータオブジェクトをDataObj.Productというコンポーネントとして構築する。DataObj.Productコンポーネントには,製品情報テーブルを操作するメソッドを随時加えてゆく。

 DataObj.Productコンポーネントを導入するには,DataObjプロジェクトにProductというクラスモジュールを加えればよい。Productクラスモジュールを「トランザクションが必要」として構成するため,MTSTransactionModeプロパティを[RequiredTransaction]に設定する(Fig.6-59)。

Fig.6-59 DataObjプロジェクトのProductクラスモジュールのMTSTransactionModeプロパティの設定
fig6_59

 Productクラスモジュールを追加したら,コンストラクタ文字列を処理してデータベース接続文字列として使うような仕組みをクラスモジュールに実装する(List 6-52)。この仕組みは,すでに「●データベース接続文字列を動的に設定できるようにする」で説明したとおりである。

 次に,DataObj.ProductコンポーネントにAddRecordというメソッドを実装する。AddRecordメソッドは,引数として「製品名」「製品名よみがな」「製品価格」「摘要」をとり,それらを製品情報テーブルに追加する。このメソッドは,戻り値として,追加した製品に割り当てられた製品番号(レコードID)を返す。

 AddRecordメソッドの処理内容は,顧客情報管理において新規顧客を追加するために実装したDataObj.CustomerコンポーネントのAddRecordメソッド(List 6-2)の処理内容と似ている。その実装は,List 6-53のようになる。

 List 6-53の77行目と79行目を見るとわかるように,製品の在庫数(STOCKフィールドの値)と,在庫のうちすでに予約されているものの数(BACKORDERフィールドの値)には,初期値として0を設定することにした。在庫数の処理については,「6.3.5 在庫の処理」で改めて説明する。また,22行目と26行目では,実行時エラーコードとしてErrorcode.Err_PRICEという値を使っている。Errorcode.Err_PRICEは,すでにList 6-19で定義したErrorcode列挙型にList 6-54に示すように加える。

 List 6-2List 6-53の違いは,対象となるデータベースが顧客情報テーブルか製品情報テーブルかという点だけであり,処理内容自体にさほど差があるわけではない。よって,詳細な説明は省略する。

●ビジネスロジックの構築
 次に,ビジネスロジックを構築してゆく。このサンプルでは,製品に関与する処理はすべてBusiness.Productコンポーネントにまとめてゆく。そこでまず,Businessプロジェクトを開き,Productという名前のクラスモジュールを追加する。追加したProductクラスモジュールでは,トランザクションを「新しく必要」に設定するため,MTSTransactionModeプロパティの値を[RequiresNewTransatcion]に設定しておく(Fig.6-60)。

Fig.6-60 BusinessプロジェクトのProductクラスモジュールのMTSTransactionModeプロパティの設定
fig6_60

 BusinessプロジェクトにProductクラスモジュールを追加したら,今度はそのクラスモジュールに製品を登録するためのメソッドを追加する。ここでは,製品を登録するメソッドの名前をAddProductとし,引数には「製品名」「製品名よみがな」「価格」「摘要」の4つを与えるものとする。また,このメソッドは,追加した製品の製品番号を戻り値として返すものとする。

 AddProductメソッドでは,先にList 6-53で実装しておいたDataObj.ProductコンポーネントのAddRecordメソッドを呼び出せばよく,そのプログラムはList 6-55のようになる。

 ところで,List 6-55では,ObjectContextオブジェクトのIsCallerInRoleメソッドを使った制限は課していない。本章の冒頭でも説明したように,製品情報を登録できるユーザーは,製品管理部に所属するユーザーだけである(「6.1.3 セキュリティの設定」を参照)。そのため,List 6-55に示したAddProductメソッドを呼び出せるユーザーは,次のいずれかということになる。この制限は,プログラム側で課すのではなく,[コンポーネントサービス]管理ツール側で設定する(プログラムでロールを判断するのではなく,プロパティでロールを判断する理由については,すでに「○COM+コンポーネントのパッケージの作成」で述べたとおりである)。

  • 製品管理部に所属するユーザー(Productsロール)
  • 製品管理部に所属する管理者(ProductsAdminロール)
  • すべての権限を備えたシステム管理者(AllAdminロール)
prevpg.gif Chapter 6 37/92 nextpg.gif