如何将全局变量传递给引用的程序集?
我正在修改一个asp.net应用程序。需要记录所有员工(网站的当前用户)操作,例如保存新客户或更新发票数据。 UI层正在调用引用的程序集BLL.dll。
我想将当前的Emplyee传递给引用的程序集。传递的Employee应该在该dll中的所有静态方法中共享。它应该是线程安全的,因为Employee可以根据请求进行更改。
我无法在BLL中公开静态字段,因为Employee存储在会话状态。
我需要一些非静态的,全局的,可由两个程序集(UI层和BLL.dll)访问,以及线程安全。
我正在考虑使用存储在当前线程对象中的一些变量。但我不知道到底应该做什么?
任何workarrounds ??
由于
答案 0 :(得分: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; }
}
然后在您的网络应用中,使用会话状态实施IEmployeeContextImplementation
,并在应用程序启动时仅调用SetImplementation
一次。
但是,会话状态仅在请求的上下文中足够好。如果你需要它去另一个线程,你必须明确地将它传递给另一个线程。