0

1) クラスのメソッドを使用して接続を設定する

//controller
using(Connection conn = new Connection()){
 conn.Open();
 MyClass myclass = new MyClass();
 myclass.setDbConnection(conn);
}

//MyClass in Model
class MyClass {
    Connection conn;

    public setDbConnection(conn){
        this.conn = conn;
    }

    public updateTableA(){
        //using this.conn;
    }
    public updateTableB(){
        //using this.conn;
    }
    public updateTableC(){
        //using this.conn;
    }

}

2) パラメータとして各メソッドに接続を渡します

//controller
using(Connection conn = new Connection()){
 conn.Open();
 MyClass myclass = new MyClass();
}


//MyClass in Model
class MyClass {

    public updateTableA(Connection conn){
        //using conn;
    }
    public updateTableB(Connection conn){
        //using conn;
    }
    public updateTableC(Connection conn){
        //using conn;
    }
}

どちらが正しい(またはより良い)方法ですか?なぜ?

4

2 に答える 2

3

答えは、パターンには本質的に欠陥があるため、これに対する適切なアプローチは実際には存在しないということです。データ オブジェクトは、データベース接続を維持する責任を負うべきではなく、データベース設計と密接に結び付けられるべきでもありません。オブジェクト リレーショナル マネージャーは、ほとんどのデータベース アプリケーションにとってはるかに優れたアプローチであることが証明されています。Entity Framework や nHibernate などの人気のあるものの 1 つを調べる必要があります。個人的には nHibernate を使用しています。

于 2012-12-17T19:12:30.207 に答える
2

あなたの2つのオプションを考えると、私は間違いなく最初のものを選びます.すべてのメソッドに接続を渡すことに追加の価値はまったくありません(常に同じ接続を使用していると仮定します)。これは、実際のビジネス ロジックを覆い隠す多くのノイズをコードに追加するだけです。

さらに、接続をコンストラクターに渡し、setDbConnectionメソッドを回避することをお勧めします。これにより、コンストラクターを呼び出した後、このメソッドを呼び出すまで失敗するオブジェクトではなく、動作するオブジェクトが確実に得られます。ただし、これは常に可能であるとは限らないため、このような初期化方法は避けられない場合があります。

IDisposable最後に、クラスは使い捨てのリソース (接続) を保持しているため、実装について考える必要があります。

そして、私は他のユーザーがすでに言ったことを間違いなく支持します-独自のデータアクセスレイヤーを展開することは本当に簡単ではないため、Entity Framework のような OR マッパーを使用することを考えてください。

于 2012-12-17T19:16:01.700 に答える