2012-05-08 67 views
0

如何将全局变量传递给引用程序集?如何将全局变量传递给引用程序集?

我正在修改一个asp.net应用程序。需要记录所有员工(网站的当前用户)操作,例如保存新客户或更新发票数据。 UI层正在调用引用的程序集BLL.dll。

我想将当前的Emplyee传递给引用的程序集。通过的员工应该是共享该dll的所有静态方法。它应该是线程安全的,因为员工可以根据请求进行更改。

我无法在BLL中公开静态字段,因为Employee存储在会话状态中。

我需要的东西不是静态的,全局的,可以通过两个程序集(UI层和BLL.dll)访问,并且线程安全。

我想使用存储在当前线程对象中的一些变量。但我不知道我应该怎么做?

任何workarrounds?

谢谢

回答

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

锁是否有其他事情正在尝试设置实施。 –

相关问题