2012-05-08 8 views
0

グローバル変数を参照アセンブリに渡すにはどうすればよいですか?グローバル変数を参照アセンブリに渡すにはどうすればいいですか?

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

現在のEmplyeeを参照アセンブリに渡したいと思います。渡されたEmployeeはのすべての静的メソッドを共有するである必要があります。従業員は要求全体を変更できるため、スレッドセーフである必要があります。

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

静的ではなく、両方のアセンブリ(UIレイヤーとBLL.dll)でアクセス可能で、スレッドセーフなものが必要です。

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

任意のワーキングアラウンド?

おかげ

答えて

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を呼び出します。

しかし、セッション状態は、要求のコンテキスト内でのみ十分です。別のスレッドを使用する必要がある場合は、そのスレッドを別のスレッドに明示的に渡す必要があります。

+0

良い解決策、それは動作するはずです。セッションはスレッドセーフなので、ロックが必要ないとは思えません。 – Costa

+1

ロックはそこに他の何かが実装を設定しようとしている場合です。 –

関連する問題