WindowsとWebアプリケーションの両方で使用するSession / Hostオブジェクトを提供する方法は?

StackOverflow https://stackoverflow.com/questions/236362

質問

現在のユーザー、個人設定、セッション履歴などを記録するためにセッション状態を多用するWebアプリケーションがあります。

次のように、ビジネス層でこのセッション情報を取得していることに気付きました:

((UserSession)HttpContext.Current.Session["UserSession"]).User.Info

これは問題を引き起こします-将来のある時点で、私のアプリケーションには、明らかにWebセッション状態を参照できないWindowsクライアントが含まれます。そのため、ビジネスレイヤーで参照できるホストまたはカスタマイズされたセッションクラスが必要です。これは、アプリケーションがWebまたはデスクトップのどちらで実行されているかを認識しません。次のようなもの:

IHost.User.Info

舞台裏では、Web実装は明らかにセッション状態を使用して情報を保存しますが、これをビジネスレイヤーから隠す必要があります。誰もがこの問題を解決したか、これにどのようにアプローチするのが最善かについて実践的なアドバイスを受けましたか?

感謝します。

役に立ちましたか?

解決

ビジネス層が別個のDLLであると仮定すると、 System.Web への参照を追加することは決してなく、結果として Session オブジェクトを直接使用することもありません。これにより、ビジネスレイヤーとクライアント(Webまたはwinforms)への公開されたインターフェイスの設計が異なります。

とはいえ、簡単な回避策として、ビジネスレイヤーにコードから Session オブジェクトを隠すラッパークラスを記述することをお勧めします。コードからの呼び出しは次のようになります。

((UserSession) DualContext.Current["UserSession"]).User.Info

そしてラッパーの実装は次のようなものになります(完了もテストもされていません):

public class DualContext 
{
   private Dictionary<string, object> winFormsSession = new Dictionary<string, object>();
   private static readonly DualContext instance = new DualContext();

   public static DualContext Current
   {
      get {  return instance; }
   }

   public object this[string key]
   {
      get 
      {
         if (HttpContext.Current != null)
            return HttpContext.Current.Session[key];
         else
            return winFormsSession[key];
      }
      set 
      {
         if (HttpContext.Current != null)
            HttpContext.Current.Session[key] = value;
         else
            winFormsSession[key] = value;
      }
   }
}

他のヒント

再設計が必要になりますが、セッション状態の使用からユーザープロファイルに切り替える場合は、クライアントアプリケーションサービスを使用して情報を共有できます。

http://msdn.microsoft.com/en-us/library /bb384297.aspx

WebサービスまたはRESTfullサービスを作成する必要があると思います。サービスは、ユーザー情報を表すXMLファイルを返します。 WindowsまたはWebアプリケーションからサービスを枯渇させることができます。

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