WindowsとWebアプリケーションの両方で使用するSession / Hostオブジェクトを提供する方法は?
-
04-07-2019 - |
質問
現在のユーザー、個人設定、セッション履歴などを記録するためにセッション状態を多用する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;
}
}
}
他のヒント
再設計が必要になりますが、セッション状態の使用からユーザープロファイルに切り替える場合は、クライアントアプリケーションサービスを使用して情報を共有できます。
WebサービスまたはRESTfullサービスを作成する必要があると思います。サービスは、ユーザー情報を表すXMLファイルを返します。 WindowsまたはWebアプリケーションからサービスを枯渇させることができます。