3

コードの重複を減らす/回避するようにコードを構成しようとしていますが、興味深い問題に遭遇しました。コードがストアド プロシージャを呼び出すたびに、ユーザー名、ドメイン、server_ip、client_ip など、ストアド プロシージャに共通のいくつかの変数を渡す必要があります。これらはすべて HttpRequest オブジェクトまたは system.environment オブジェクトから取得されます。

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

ストアド プロシージャを呼び出すたびに 4 行のコードを繰り返すのは大したことではないことはわかっていますが、非常に早い段階でコードの重複を排除したいと考えています。

4

7 に答える 7

4

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

次に、ビジネスレイヤーで同様のことを行います-コンストラクターでこれらの4つのプロパティを持つ基本クラス。

次に、UI は new BusObj( Request["username"], ... ).method() を実行します。

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

于 2009-02-26T02:02:01.087 に答える
3

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

多数のパラメーターを受け取るメソッドがある場合 (経験則としては 4 が適切ですが、これはケースバイケースであることは間違いありません)、そのメソッドがオブジェクトをパラメーターとして受け取るようにするときです。個々のパラメーターの代わりに。99.99999999999999999999% の確率で、そのようなオブジェクトは不変でなければなりません (書き込み可能なインスタンス変数はありません)。

于 2009-02-26T01:32:25.620 に答える
2

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

于 2009-02-26T01:18:18.867 に答える
2

これは、あなたが好むかもしれないし、好まないかもしれない奇妙なアイデアです: 「プロファイル」クラスと、プロファイルを共通の引数をとる関数の引数に展開する関数を定義します。

class P {
    readonly string name;
    readonly string domain;
    public P(string name, string domain) {
        this.name = name; this.domain = domain;
    }
    public void inject(Action<string, string> f) {
        f(p.arg1, p.arg2);
    }
    public T inject<T>(Func<string, string, T> f) {
        return f(p.arg1, p.arg2);
    }
}

AddressOf 演算子がある VB.net でうまく機能する可能性があります。可読性とカプセル化を簡単に損なう可能性があるため、この種のものを使用するのは本当に慎重です。

于 2009-02-26T01:29:56.547 に答える
1

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

代わりに HttpContext を使用することについては、他の人が示唆しているように、それは悪い考えだと思います。HttpContext のドメインに依存関係を導入し始めると、それを取り除くのは非常に困難です。後で HttpContext なしでモジュールを使用したくなったらどうしますか? 単体テストはどうですか?

于 2009-02-26T01:18:33.593 に答える
1

System.Web.HttpContext.Current.Request を試して、現在のリクエストを取得してください。

于 2009-02-26T01:19:13.000 に答える
1

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

そうは言っても、それを考慮しても続行したい場合は、このような情報の別のオプションがあります. 必要なプロパティを含むカスタム SecurityPrincipal (実装 IPrincipal) を作成し、それをスレッドにアタッチします。ユーザーがログインするときにそれらを入力すると、リクエスト中にどこからでもアクセスできます。呼び出し元は、これが行われたことを確認する必要がありますが、少なくともプラットフォーム固有ではありません。

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

于 2009-02-26T01:42:24.737 に答える