0

グローバル変数を参照されるアセンブリに渡す方法は?

asp.netアプリを変更しています。新規顧客の保存や請求書データの更新など、すべての従業員(Webサイトの現在のユーザー)のアクションをログに記録する必要があります。UIレイヤーは、参照されるアセンブリBLL.dllを呼び出しています。

現在のEmplyeeを参照されているアセンブリに渡したい。渡されたEmployeeは、そのdll内のすべての静的メソッドで共有する必要があります。従業員はリクエストごとに変更される可能性があるため、スレッドセーフである必要があります。

従業員がセッション状態で保存されているため、BLLで静的フィールドを公開できません。

静的ではなく、グローバルで、両方のアセンブリ(UIレイヤーとBLL.dll)からアクセスでき、スレッドセーフではないものが必要です。

現在のスレッドオブジェクトに格納されている変数を使用することを考えています。しかし、私は正確に何をすべきかわかりませんか?

回避策はありますか?

ありがとう

4

1 に答える 1

2

基本的に、参照を取得できる BLL に何かが必要です。インターフェイスで戦略パターンを使用できます。

// IN BLL.dll

public interface IEmployeeContextImplementation 
{
   Employee Current { get; }
}

public static EmployeeContext 
{
   private static readonly object ImplementationLock = new object();
   private static IEmployeeContextImplementation Implementation;

   public static void SetImplementation(IEmployeeContextImplementation impl)
   {
      lock(ImplementationLock)
      {
         Implementation = impl;
      }
   }
   public static Employee Current { get { return Implementation.Current; }
}

次に、Web アプリでIEmployeeContextImplementationセッション状態を実装し、SetImplementationアプリケーションの開始時に 1 回だけ呼び出します。

ただし、セッション状態は、リクエストのコンテキスト内でのみ十分です。別のスレッドで実行する必要がある場合は、別のスレッドに明示的に渡す必要があります。

于 2012-05-08T14:25:04.773 に答える