さて、ここで私が直面している問題があります。
アプリケーションに、データベース接続を必要とするメソッドを持つクラスがいくつかあります。クラスを設計する 2 つの異なる方法の間で迷っています。どちらも依存性注入を中心にしています。
メソッド呼び出しの前に呼び出し元によって設定される接続のプロパティを提供します。これにはいくつかの欠点があります。
接続プロパティに依存するすべてのメソッドは、そのプロパティを検証して、それがnullではないこと、開いていること、および操作が台無しになる場合はトランザクションに関与していないことを確認する必要があります。
接続プロパティが予期せず閉じられた場合、すべてのメソッドは (1.) 例外をスローするか、(2.) 強制的に開く必要があります。必要な堅牢性のレベルに応じて、どちらのケースも適切です。(これはメソッドに渡される接続とは異なることに注意してください。接続への参照は、メソッド呼び出しの存続期間だけではなく、オブジェクトの存続期間にわたって存在します。その結果、接続のボラティリティが高くなるように見えます。私に。)
プロパティを提供することは、(とにかく、私には)対応するプロパティ
Connection
を求めて叫ぶようです。Transaction
これにより、トランザクションがいつ使用され、いつ使用されないかを明確にする必要があるため、ドキュメントに追加のオーバーヘッドが生じます。
一方、Microsoft は、セット アンド インボーク パラダイム全体を支持しているようです。
接続を引数としてメソッドに渡す必要があります。これには、いくつかの利点と欠点があります。
パラメータリストは当然大きくなります。これは、主にコールの時点で、私にとって面倒です。
接続 (およびトランザクション) は使用前に検証する必要がありますが、それへの参照はメソッド呼び出しの間のみ存在します。
ただし、要点は非常に明確です。接続を提供する必要があること、およびメソッドが背後で自動的に接続を作成しないことは明らかです。
メソッドがトランザクションを必要としない場合 (たとえば、データベースからデータを取得するだけのメソッド)、トランザクションは必要ありません。メソッド シグネチャによる明確さの欠如はありません。
メソッドがトランザクションを必要とする場合は、メソッド シグネチャにより非常に明確です。繰り返しますが、明確さの欠如はありません。
Connection
クラスはまたはプロパティを公開しないため、Transaction
呼び出し元がそれらを介してプロパティやメソッドにドリルダウンしようとする可能性はなく、デメテルの法則が適用されます。
私は知っています、それはたくさんあります。しかし一方では、Microsoft の方法があります。プロパティを提供し、呼び出し元にプロパティを設定させてから、メソッドを呼び出します。そうすれば、複雑なコンストラクターやファクトリー メソッドなどを作成する必要がなくなります。また、多くの引数を持つメソッドは避けてください。
次に、オブジェクトでこれら 2 つのプロパティを公開すると、消費者がこれらのプロパティを悪用するのを助長する傾向があるという単純な事実があります。(私が責任を負っているわけではありませんが、それでもです。) しかし、私はただ、くだらないコードを書きたくないだけです。
あなたが私の立場だったら、どうしますか?