- - PR -
親子テーブルのクラス設計につきまして
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2008-07-23 09:31
参考になります。今まではテーブルの名前をそのままクラス名に割り当てていました。(汗
ASPXページ名のは適当でしたが、トランザクション処理を使った更新処理を Aspx.csで行うのはおかしいというご指摘でしょうか? すみません、うまく理解できておりません。 更新処理は本来、ビジネスロジックレイヤーにOrderInfo(←OrderDetailInfo含む)を渡してUpdateOrderの中に書かれているべき処理という事でしょうか? BLL.Order.UpdateOrder(OrderInfo orderInfo){ using(TransactionScope ts = new TransactionScope()){ //更新処理 } } 何度も恐縮ですが、ご教授頂けますと助かります。 [ メッセージ編集済み 編集者: 骨骨★Rock! 編集日時 2008-07-23 09:56 ] | ||||||||
|
投稿日時: 2008-07-23 12:55
あ〜、勘違いしてました。 Order.aspx.cs ってのは BLL.Order とは別モノなんですね。 # てっきり同じかと思って「なぜ BLL.Order クラスが aspx なんだ?」と疑問に思った次第です。 そうすると、階層分けしているのにプレゼンテーションレイヤーに属する Order.aspx.cs でトランザクション操作するのはおかしいですね。 BLL.Order でやってください。 で、ホントは BLL.Order はビジネスロジックレイヤーではなくデータアクセスレイヤーに属するものかと思います。 (データストアと OrderInfo や OrderDetailInfo などのドメインオブジェクトをマッピングするクラスですからね。) ただ、そうすると現在の設計に大きく変更が発生しそうな気もするので、ビジネスロジックレイヤーのままでもいいかと思います。 _________________ C#と諸々 | ||||||||
|
投稿日時: 2008-07-23 14:07
分りにくくてすみません、Order.aspx.cs ってのは BLL.Order とは別モノです。
現状のコードをアドバイスをもとに修正してみました。イメージとして合っておりますでしょうか。 【--現状--】 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; } | ||||||||
|
投稿日時: 2008-07-23 21:13
はい、提示されたコードを見る限り大丈夫だと思います。 あと、(今更かもですが) DAL.SqlOrder クラスからは OrderInfo や OrderDetailInfo を意識しないようにするといいかなと思います。 つまり、UpdateOrder メソッドや UpdateOrderDetail メソッドでは、直接フィールドを受け取ることになり、取得系のメソッドでは DataTable や DataRow を返すことになります。 これで、DAL.SqlOrder がデータアクセスにかなり特化できます。 # で、そうなるとたぶん、DAL.SqlOrder クラスの代わりにテーブルアダプタ使った方がいいですね _________________ C#と諸々 | ||||||||
|
投稿日時: 2008-07-24 11:21
よこけん様、
ご返答ありがとうございます。
そこまで変えるのはちょっと現段階ではむずかしいです。。。 でもいろいろとアドバイスありがとうございました。 大変勉強になりました。今後とも宜しくお願いいたします。 ほねほねろっく |