質問

私は/減らすコードの重複を避けるために、このような方法で自分のコードを構築しようとしていると私は興味深い問題が発生しています。ユーザ名、ドメイン、SERVER_IPとCLIENT_IPなど:私のコードは、ストアドプロシージャを呼び出すたびに、私は、ストアドプロシージャに共通するいくつかの変数を渡す必要があります。これらは、すべてのHttpRequestオブジェクトまたはsystem.environmentオブジェクトのいずれかから来ています。

これらは、すべてのストアドプロシージャに渡されますので、

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

私はそれがコードの4行、私はストアドプロシージャを呼び出すたびに繰り返すように、このような大きな問題ではありません実現が、私はむしろ、非常に早い段階でコードの重複を排除するであろう。

役に立ちましたか?

解決

これらの値の4つのプロパティが含まれている基本クラスから継承するためにあなたのデータ層を設定します。パブリックコンストラクタを作成し、それらの4つの特性を必要とします。

次に、ビジネス層に類似した何かを - 。コンストラクタのもの4つのプロパティを持つ基本クラスを

次に、UI行い、新たなにBusObj(リクエスト[ "ユーザー名"]、...).method()

データ層内では、各メソッドは、アレイに追加のパラメータを追加することができ、それらの4つの特性を有するSQLParameterアレイを構築する方法を有することができる。

他のヒント

に関係なく、プログラミング言語の一般的なルールとして、あなたはあなたの目を細めすることができ、コードは、あなたがそれのうち関数/メソッド/メッセージを作成し、パラメータを渡す必要があります同じように見えます。

あなたは多数のパラメータを取るメソッドを持っていたら見てもう一つは、(4親指の良いルールですが、それは間違いなく、ケース・バイ・ケースである)この方法は、オブジェクトを取ることを確認するための時間です代わりに、個々のパラメータのパラメータとして。そのようなオブジェクトは(NO書き込み可能インスタンス変数)不変でなければならない時間の99.99999999999999999999%。

HttpContext.CurrentはあなたがHTTP要求に見つけて、より重要なのにApp_Code内の利用可能なものと同様の情報を持っています。

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

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で良い仕事かもしれません。あなたは簡単に読みやすさとカプセル化を損傷する可能性があるため、私は、事のこのタイプを使用して、本当に慎重になります。

私はあなたが今それを持っている方法、それを続けるだろう。これは、ユニットテストに、クリーナー/拡張、変更が容易、かつ簡単です。

いくつか他の人が提案してきたように代わりのHttpContextを使用するためとして、私はそれは悪い考えであることを言うでしょう。あなたがのHttpContextにドメイン内の依存関係を導入し始めると、それはそれを取ることは非常に困難です。後であなたにHttpContextをせずに、あなたのモジュールを使用したい場合はどう?何単位について、それをテストする?

現在のリクエストを取得するためにSystem.Web.HttpContext.Current.Requestを試してみてください。

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

あなたのアカウントにそれを取ると、まだ続行したい場合は、

言われていること、ここでこのような情報のための別のオプションがあります。あなたが必要とスレッドに添付プロパティを含むカスタムSecurityPrincipalを(IPrincipalを実装)を作成します。ユーザがログインするときにそれらを記入して、あなたは、要求時にどこにでもアクセスすることができます。あなたの呼び出し側が、まだこれが行われていたが、少なくともそれはプラットフォーム固有のものではないことを確認する必要があります。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top