3


0

コードの重複を減らしたり回避したりするためにコードを構造化しようとしていますが、興味深い問題が発生しました。 コードがストアドプロシージャを呼び出すたびに、ストアドプロシージャに共通のいくつかの変数(username、domain、server_ip、client_ipなど)を渡す必要があります。 これらはすべてHttpRequestオブジェクトまたはsystem.environmentオブジェクトのどちらかから来ています。

これらはすべてのストアドプロシージャに渡されるので、私の最初の考えはデータベースラッパーであり、毎回これらを初期化して渡すユーティリティクラスを作成することでしたので、私は自分のコードでそれを行う必要はありません。 問題は、C#クラス(App_Codeフォルダー内)にHttprequestオブジェクトが表示されないことです。 もちろん、これをラッパーへの引数として渡すこともできますが、それはラッパーを作成するという目的全体を無効にするでしょう。 私はここに何かが足りない?

ストアドプロシージャを呼び出すたびに4行のコードを繰り返すのはそれほど大したことではないと思いますが、ごく初期の段階でコードの重複を排除したいと思います。

7 回答


4


これらの値の4つのプロパティを含む基本クラスから継承するようにデータ層を設定します。 パブリックコンストラクタにこれら4つのプロパティを要求させる。

次に、ビジネスレイヤで基本クラスを作成し、これらの4つのプロパティをコンストラクタで作成します。

その後、UIは新しいBusObj(Request ["username"]、…​を実行します。 )。方法()

データレイヤ内では、これら4つのプロパティを持つSQLParameter配列を作成するメソッドを作成できます。その後、各メソッドは配列に追加のパラメータを追加できます。


3


プログラミング言語に関係なく、一般的な規則として、目を細めてコードが同じに見える場合は、そこから関数/メソッド/メッセージを作成してパラメータを渡す必要があります。

多数のパラメータを取るメソッドがある場合は、もう1つ検討する必要があります(4が良い経験則ですが、ケースバイケースで基本的に定義されています)。そのメソッドがオブジェクトをパラメータとして受け取るようにする時間です。個々のパラメータの代わりに。 99.99999999999999999999このようなオブジェクトは不変でなければなりません(書き込み可能なインスタンス変数はありません)。


2


HttpContext.Currentには、HttpRequestで見つけたものと同様の情報があり、さらに重要なことにはApp_Code内にあります。


2


これはあなたが好むかもしれないし、気に入らないかもしれない奇妙な考えです: 'profile’クラスと、共通の引数を取る関数の引数にプロファイルを拡張する関数を定義します。

クラスP {読み取り専用の文字列名;読み取り専用の文字列ドメイン。パブリックP(文字列名、文字列ドメイン){this.name = name; this.domain = domain; public void inject(アクションf){f(p.arg1、p.arg2);} } public T inject(Func f){return f(p.arg1、p.arg2);} }}

それはあなたがAddressOf演算子を持っているVB.netでよりよく働くかもしれません。 あなたが読みやすさとカプセル化を容易に傷つけることができるので、私は本当にこの種の事を使うことに慎重になるでしょう。


1


私はあなたが今それを持っているようにそれを保ちます。 それは、よりクリーンで、拡張や修正が簡単で、単体テストが簡単です。

他の人が示唆しているように代わりにHttpContextを使うことに関しては、私はそれが悪い考えであると言うでしょう。 HttpContextのドメインに依存関係を導入し始めたら、それを取り出すことは非常に困難です。 後でHttpContextを使わずに自分のモジュールを使いたい場合はどうしますか? 単体テストについてはどうですか?


1


現在の要求を取得するには、System.Web.HttpContext.Current.Requestを試してください。


1


滑りやすい斜面を進む可能性があります。 DRYのポイントは、要件の変更によって複数の類似した場所でコードを変更する必要が生じるような複数の場所でビジネスロジックを繰り返さないことです。 4行が文脈依存であれば、4行が同じだからといって、必ずしもリファクタリングする必要はありません。 グローバル変数を使用しているという点でhttprequestを参照することによってカプセル化も破られています。 あなたのクラスの消費者として、私はWebアプリケーションからしか呼び出せなかった実装の詳細を知っていなければなりません。

そうは言っても、それを考慮に入れても続行したい場合は、ここにこのような情報に対する別の選択肢があります。 必要なプロパティを含むカスタムSecurityPrincipal(Implement IPrincipal)を作成し、それをスレッドに添付します。 ユーザーがログインしたときにそれらを入力してください。そうすれば、リクエスト中にどこからでもアクセスできます。 あなたの呼び出し側はまだこれが行われたことを確かめる必要があるでしょうが、少なくともそれはプラットフォーム特有ではありません。

それ以外の場合は、最適なカプセル化のために、必要なプロパティを持つクラスを、それらのプロパティを使用する必要がある各オブジェクトのコンストラクタに渡します。