0

ビジネスロジックとデータ呼び出しを別々のアセンブリとして持つasp.net Webソリューションを継承しました。ビジネス層には、HttpContextセッション値を取得/設定するコールが少数しかありません。私はビジネスロジックからこれを抽象化するための例を見てきました。私は非Webプロジェクトでこれらのアセンブリを再利用できるようにしたいと考えています。これを行う。私はセッションシナリオに応じていくつかの種類の持続ストアから値を取得するセッションファクトリを考えていましたが、私はアーキテクチャには本当に新しく、ポインタまたは2つを感謝します。ビジネスロジックからASP.netセッションコールを削除する

+0

セッション状態にはどのような値が格納されていますか? –

+0

今はGuidのリストとしてユーザーの詳細とそのデータ権限を含む複雑な型です。 –

答えて

-1

ビジネス層にはどのようなビジネスがセッションを持っていますか?この文をもう少し理解するには、次のように考えてください:なぜビジネス層はユーザー関連の情報を永続させる必要がありますか?

ビジネス層はとプロセスで仕事にユーザー関連のデータが必要ですが、ないこと。つまり、現在格納されているデータを注入する必要があります。つまり、必要な機能にパラメータとして渡す必要があります。このようにして建築契約を結ぶことは、あまりにも明白な方法で、「ちょっと、私の仕事をするためのユーザー情報が必要です」と言います。ビジネスレイヤーは、そのデータを使用して何らかの方法でユーザーを認証または承認することはできますが、認証結果の処理が完了したら破棄する必要があります。値が永続化されて1つまたは2つのデータベースをデータベースに保存する場合、データベース呼び出しの効率性に問題があります。そのような単純なものに対するデータベース呼び出しは迅速です。

私の提案は、ビジネスレイヤーからセッションへの参照をすべて削除し、渡される必要があるユーザーデータを含めるように関数の署名を変更することです。

+0

リフレクションには正しいですが、そのレイヤーに値を保存する必要はありません。セッションで現在保持されているデータをレイヤーで使用できるようにするだけです。この例では、セッションに格納されているGuidのリストはデータベースに直接反映されるため、必要に応じてそこから取得できます。 私が本当に望んでいたのは、このデータのリクエストを、適切な場所からリストを返すサードパーティ(セッションファクトリ)に渡すことでした。これは、UIとデータベースから呼び出されるSessionです。そうでない場合。 –

+0

恐ろしい...私は正当な理由で投票に反対しているわけではありませんが、私はこの投票に投票した人から私の間違いで教育されるのが大好きです。私は2ポイントを欠場することはありません、それは単に原理の問題です。 – slugster

0

私の意見では、ISessionProviderインターフェイスを作成し、Dictionary<string, object> {get; }とするのが最も簡単な方法です。その後、実際のセッションバッグの内容を返すpublic class HttpSessionProvider : ISessionProviderを作成します。

少なくとも、このオブジェクトをWebアプリケーションでインスタンス化し、手動で指定するか、IOCパターンを使用してバックエンドクラスに指定します。

[編集]小さな反射の後、それはクリーンな方法ではありません。 asp.netのフレームワークに依存することはありませんが、セッションの "asp.net"コンテンツにはまだアクセスできます。この場合 、インタフェースを保つが、どちらかは、特定のプロパティ(文字列の顧客、int型のユーザーIDなど)を追加したり、唯一の私はいくつかのプロジェクトにこのような何かを行っている

0

実際のビジネス・データと辞書を返します:

public interface IAppContext { 
    string SomeVariable { 
     set; 
     get; 
    } 
} 
public class HttpContextAppContext : IAppContext { 

    public static readonly string CONTEXT_PREFIX = "appcontext_"; 

    public string SomeVariable { 
     set { HttpContext.Current.Session[CONTEXT_PREFIX + "SomeVariable"] = value; } 
     get { return (string)HttpContext.Current.Session[CONTEXT_PREFIX + "SomeVariable"]; } 
    } 
} 
関連する問題