2

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

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

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

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

IHost.User.Info

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

助けていただければ幸いです。

4

3 に答える 3

2

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

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

于 2008-10-25T14:47:02.773 に答える
2

ビジネス層が別個の 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;
      }
   }
}
于 2008-10-25T14:08:45.813 に答える
-2

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

于 2008-10-25T13:04:41.180 に答える