2016-10-10 10 views
0

私の主な問題は、ソースを読みにくくするセッション変数を設定/取得するメソッド呼び出しがいっぱいであるというコードがあることです。私はより良い/よりシンプルな/よりエレガントなソリューションを探しています。私はクラス、ラッパークラス、暗黙の型変換で演算子のオーバーロードを試みましたが、私はそれらすべてに問題があります。通常の変数のようなセッション変数を扱う

通常の変数のようなセッション変数を扱いたいと思います。 多くの記事を読んだ後、私はさらに簡単したいのですが、次の解決策を考え出した:だから

public static SV_string UserID = new SV_string("UserID"); 

UserID.val = "Admin"; //Now the value assignment is quite simple 
string user = UserID.val; //Getting the data is quite simple too 

UserID = "Admin"; //but it would be even simpler 

public class SV_string 
{ 
    private string key = ""; //to hold the session variable key 

    public SV_string(string key) 
    { 
     this.key = key; // I set the key through the constructor 
    } 
    public string val // I use this to avoid using setter/getter functions 
    { 
     get 
     { 
      return (string)System.Web.HttpContext.Current.Session[key]; 
     } 
     set 
     { 
      System.Web.HttpContext.Current.Session[key] = value; 
     } 
    } 
} 

私は変数名と同じキーを使用します希望の動作を得るための方法はありますか?

ありがとうございます!

+1

これを行う方法はないと思うし、C#デベロッパーにとって直感的ではないので、これをやりたいと思うべきかどうかはわかりません。代わりにメソッドを使うほうが良いでしょう( 'UserID.SetValue(" Admin ")')。 –

+0

これは単なるファサードのデザインパターンです。私にとって完璧にうまくいくと思う。 – Enigmativity

+0

あなたの命名はひどいです。BTW –

答えて

0

するだけで、あなたのセッション変数をラップするプロパティを使用し
その実装は、セッション変数またはどのキーの名前を使用して、それが中に格納されていることを知っているあなたのコードの他の部分は必要ありません:。

public string UserId 
{ 
    get 
    { 
     return (string)System.Web.HttpContext.Current.Session["UserId"]; 
    } 
    set 
    { 
     System.Web.HttpContext.Current.Session["UserId"] = value; 
    } 
} 
は、
+0

質問がセッションコンテキストに関するものであることを考慮すると、セッションコンテキストが利用可能であるという前提は、質問に固有のものです。 –

+0

問題は、彼が明らかにこのロジックをあるタイプにカプセル化しようとしているため、他の場所で擬似言語機能として扱うことができます(実際には実現できません)。それぞれのインスタンスは目標を達成しません。 OPは非常に具体的なことを求めてきましたが、実際には有効でない(または推奨される)ため、実際には答えがありません。 –

+0

FWIWセッション記憶域を処理する適切な方法ではないことを示唆しているわけではありません.OPが達成しようとしている非常に具体的なセマンティクスを提供していません。 –

1

あなたは、次のセッションのラッパーを作成し、ちょうどあなたが、その後続く

として使用します

public static class EasySession 
{ 
    public static string UserId 
    { 
     get 
     { 
      return Get<string>(); 
     } 
     set 
     { 
      Set(value); 
     } 
    } 

    public static string OtherVariableA 
    { 
     get 
     { 
      return Get<string>(); 
     } 
     set 
     { 
      Set(value); 
     } 
    } 

    public static <datatype> OtherVariableB 
    { 
     get 
     { 
      return Get<datatype>(); 
     } 
     set 
     { 
      Set(value); 
     } 
    } 


    static void Set<T>(T value, [CallerMemberName] string key = "") 
    { 
      System.Web.HttpContext.Current.Session[key] = value; 
    } 

    static T Get<T>([CallerMemberName] string key = "") 
    { 
     return (T)System.Web.HttpContext.Current.Session[key]; 
    } 
} 

それにあなたのメソッド/プロパティ/メンバーを追加することができます

EasySession.UserId = "Admin" 

まだまだ良いです。あなたがC#6.0を使用している場合、あなたの名前空間

using System; 
using static xxx.EasySession; 

に以下を追加することができます。これは、あなたがちょうどここ

UserId = "Admin" 

呼び出すことができます、それがどのように動作するかである

[CallerMemberName]意志取得または設定する名前を取得するこの場合、基本的には「UserId 」と設定されます(例:UserId、Admin)

次のようにします。 System.Web.HttpContext.Current.Session ["UserId"] = "Admin";

(参考:https://msdn.microsoft.com/en-us/magazine/dn879355.aspx)私は実際にHTTPコンテキスト内のセッション変数としてこれらの変数にアクセスし、そのインタフェースの操作にインターフェース(なしのプロパティ)、および1つの具体的な実装を作成することをお勧め

+0

1つのこと以外は良い解決策のようです。私は、セッション変数の数が1つであることに言及することを忘れていました。私がよく理解すれば、私は多くの仕事とコードであるすべての変数に対してset/getを書く必要があります。 (そして私はそれを避けたい)。 –

+0

基本的にすべての変数を移動するには時間がかかるかもしれませんが、一度やり直してから変数を追加するだけです。しかし、あなたは時間を無駄にしたくないと理解しています。おそらくテストをして、それが機能するかどうかを確認してください。上のこのコードは、私が実際に現在使っているもののサンプルです。そこには約10のセッション変数しかありません。 –

+0

私は6つの別々のソファで約1500のセッション変数を持っています。私は試してみて、おそらくすべてのコードを生成するスクリプトを書くでしょう。 –

0

; ユニットテストで使用できる別の模擬実装もあります。そのような場合はHTTPコンテキストが利用できないためです。

あなたのコードでは、これらのインターフェイスに対してプログラムを作成し、具体的な実装は実行時に注入されます。サイトの開始時には、Sessionを使用する具体的な実装です。テストから、それは嘲笑された実装です。

プロパティの代わりに操作を使用する理由は、通常のプロパティにアクセスするだけでなく、重要な副作用を持つセッション変数にアクセスするだけであることをユーザーに明示するためです。

警告:使用しないでください静的 !!!これは、異なるユーザー間で共有データのような望ましくない副作用を引き起こします。

+0

これはOPのシナリオを処理する適切な方法ですが、彼が実際に求めていることはできません(これは不可能です)。 –

+0

"私は通常の変数のようなセッション変数を扱いたいと思っています"と返答したいと思います。単に質問に答えるのではなく、 –

+0

このコメントを元の投稿に移動しました。 –

関連する問題