- PR -

親子テーブルのクラス設計につきまして

投稿者投稿内容
骨骨★Rock!
常連さん
会議室デビュー日: 2007/09/11
投稿数: 38
投稿日時: 2008-07-23 09:31
引用:


例えばこんな感じですかね。

Order → OrderRepository
OrderDetail → OrderDetailRepository
OrderInfo → Order
OrderDetailInfo → OrderDetail

特に上 2 つのクラス名は変えた方がいいかと。(〜Repository という名前じゃなくてもいいですが)
データストアから注文データを取得したり更新したりするためのクラスの名前が "注文" ではおかしいと思います。



参考になります。今まではテーブルの名前をそのままクラス名に割り当てていました。(汗

引用:

ところで、骨骨★Rock!さんの最初の投稿で
> /*Order.aspx.cs*/
と書かれてますが、書き間違いですよね?(aspx じゃないですよね?)



ASPXページ名のは適当でしたが、トランザクション処理を使った更新処理を
Aspx.csで行うのはおかしいというご指摘でしょうか?
すみません、うまく理解できておりません。
更新処理は本来、ビジネスロジックレイヤーにOrderInfo(←OrderDetailInfo含む)を渡してUpdateOrderの中に書かれているべき処理という事でしょうか?

BLL.Order.UpdateOrder(OrderInfo orderInfo){
 using(TransactionScope ts = new TransactionScope()){
  //更新処理
 }
}

何度も恐縮ですが、ご教授頂けますと助かります。


[ メッセージ編集済み 編集者: 骨骨★Rock! 編集日時 2008-07-23 09:56 ]
よこけん
大ベテラン
会議室デビュー日: 2006/01/31
投稿数: 216
投稿日時: 2008-07-23 12:55
引用:
骨骨★Rock!さんの書き込み (2008-07-23 09:31) より:

ASPXページ名のは適当でしたが、トランザクション処理を使った更新処理を
Aspx.csで行うのはおかしいというご指摘でしょうか?
すみません、うまく理解できておりません。
更新処理は本来、ビジネスロジックレイヤーにOrderInfo(←OrderDetailInfo含む)を渡してUpdateOrderの中に書かれているべき処理という事でしょうか?

BLL.Order.UpdateOrder(OrderInfo orderInfo){
 using(TransactionScope ts = new TransactionScope()){
  //更新処理
 }
}



あ〜、勘違いしてました。
Order.aspx.cs ってのは BLL.Order とは別モノなんですね。
# てっきり同じかと思って「なぜ BLL.Order クラスが aspx なんだ?」と疑問に思った次第です。

そうすると、階層分けしているのにプレゼンテーションレイヤーに属する Order.aspx.cs でトランザクション操作するのはおかしいですね。
BLL.Order でやってください。

で、ホントは BLL.Order はビジネスロジックレイヤーではなくデータアクセスレイヤーに属するものかと思います。
(データストアと OrderInfo や OrderDetailInfo などのドメインオブジェクトをマッピングするクラスですからね。)
ただ、そうすると現在の設計に大きく変更が発生しそうな気もするので、ビジネスロジックレイヤーのままでもいいかと思います。

_________________
C#と諸々
骨骨★Rock!
常連さん
会議室デビュー日: 2007/09/11
投稿数: 38
投稿日時: 2008-07-23 14:07
引用:

BLL.Order.UpdateOrder(OrderInfo orderInfo){
 using(TransactionScope ts = new TransactionScope()){
  //更新処理
 }
}
あ〜、勘違いしてました。
Order.aspx.cs ってのは BLL.Order とは別モノなんですね。
# てっきり同じかと思って「なぜ BLL.Order クラスが aspx なんだ?」と疑問に思った次第です。



分りにくくてすみません、Order.aspx.cs ってのは BLL.Order とは別モノです。

引用:

そうすると、階層分けしているのにプレゼンテーションレイヤーに属する Order.aspx.cs でトランザクション操作するのはおかしいですね。
BLL.Order でやってください。

で、ホントは BLL.Order はビジネスロジックレイヤーではなくデータアクセスレイヤーに属するものかと思います。
(データストアと OrderInfo や OrderDetailInfo などのドメインオブジェクトをマッピングするクラスですからね。)
ただ、そうすると現在の設計に大きく変更が発生しそうな気もするので、ビジネスロジックレイヤーのままでもいいかと思います。



現状のコードをアドバイスをもとに修正してみました。イメージとして合っておりますでしょうか。

【--現状--】
OrderInfoがOrderItemInfoを持つ形になっておりませんので、データをDBに保存する流れは以下のような感じです。

【Aspx.cs】--プレゼンテーション層

//OrderInfoに情報を格納
OrderInfo orderInfo = new OrderInfo(1,1000,....);

//オーダー明細情報を格納
OderDetailInfo orderDetailInfo = new OrderDetailInfo(1,'商品1',1,1000..);

using(TransactionScope ts= new TransactionScope()){
 //BLLのUpdateOrderを呼びます。
 BLL.Order.UpdateOrder(orderInfo);
 
 for(int i=0; i<OrderDetailInfo.Count; i++){
  //BLL.OrderDetail.UpdateOrderDetailを呼びます。※ BLL.OrderDetailのソースは  //BLL.Orderと同じなので省略させて頂きます。
  OrderDetail.UpdateOrderDetail(orderDetailInfo[i]);
 }
 ts.Complete();
}


【BLL.Order.cs】ビジネスロジック層

public static bool UpdateOrder(OrderInfo orderInfo){
 //DALのUpdateOrderを呼びます。
 return DAL.UpdateOrder(orderInfo);
}

【DAL.SQLOrder.cs】データアクセス層

public static bool UpdateOrder(OrderInfo orderInfo){
 bool retValue;
 string sql="Update [Order] SET .....";
//DB処理(省略)
 return retValue;
}
-------------------------------------------------------------------------
【--修正後--】
・OrderInfoがOrderItemInfoを持つ形に変更
・トランザクション処理はBLLで実行
・OrderDetailクラスは削除

【Aspx.cs】--プレゼンテーション層

//OrderInfoに情報を格納
OrderInfo orderInfo = new OrderInfo(1,1000,....);

//OrderInfoに明細情報を追加
orderInfo.AddOrderDetail(new OrderDetailInfo(1,'商品A',1,2000,));

//BLLのUpdateOrderを呼びます。
BLL.Order.UpdateOrder(orderInfo);
 
【BLL.Order.cs】ビジネスロジック層

public static bool UpdateOrder(OrderInfo orderInfo){
using(TransactionScope ts= new TransactionScope()){
  //DALのUpdateOrderを呼びます。
  DAL.UpdateOrder(orderInfo);

  for(int i=0; i<OrderDetailInfo.Count; i++){
   //オーダー明細を更新
   DAL.UpdateOrderDetail(orderDetailInfo[i]);
  }
  ts.Complete();
 }
}

【DAL.SqlOrder.cs】データアクセス層

//オーダー情報を更新します。
public static bool UpdateOrder(OrderInfo orderInfo){
 bool retValue;
 string sql="Update [Order] SET .....";
 //DB処理(省略)
 return retValue;
}

//オーダー明細を更新します。
public static bool UpdateOrderDetail(OrderDetailInfo orderDetailInfo){
 bool retValue;
 string sql="Update OrderDetail SET .....";
 //DB処理(省略)
 return retValue;
}


よこけん
大ベテラン
会議室デビュー日: 2006/01/31
投稿数: 216
投稿日時: 2008-07-23 21:13
引用:
骨骨★Rock!さんの書き込み (2008-07-23 14:07) より:
現状のコードをアドバイスをもとに修正してみました。イメージとして合っておりますでしょうか。



はい、提示されたコードを見る限り大丈夫だと思います。

あと、(今更かもですが) DAL.SqlOrder クラスからは OrderInfo や OrderDetailInfo を意識しないようにするといいかなと思います。
つまり、UpdateOrder メソッドや UpdateOrderDetail メソッドでは、直接フィールドを受け取ることになり、取得系のメソッドでは DataTable や DataRow を返すことになります。
これで、DAL.SqlOrder がデータアクセスにかなり特化できます。

# で、そうなるとたぶん、DAL.SqlOrder クラスの代わりにテーブルアダプタ使った方がいいですね

_________________
C#と諸々
骨骨★Rock!
常連さん
会議室デビュー日: 2007/09/11
投稿数: 38
投稿日時: 2008-07-24 11:21
よこけん様、
ご返答ありがとうございます。

引用:

あと、(今更かもですが) DAL.SqlOrder クラスからは OrderInfo や OrderDetailInfo を意識しないようにするといいかなと思います。
つまり、UpdateOrder メソッドや UpdateOrderDetail メソッドでは、直接フィールドを受け取ることになり、取得系のメソッドでは DataTable や DataRow を返すことになります。
これで、DAL.SqlOrder がデータアクセスにかなり特化できます。

# で、そうなるとたぶん、DAL.SqlOrder クラスの代わりにテーブルアダプタ使った方がいいですね



そこまで変えるのはちょっと現段階ではむずかしいです。。。
でもいろいろとアドバイスありがとうございました。
大変勉強になりました。今後とも宜しくお願いいたします。

ほねほねろっく

スキルアップ/キャリアアップ(JOB@IT)