Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 如何将全局变量传递给引用的程序集?_Asp.net_.net_Global Variables - Fatal编程技术网

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

Asp.net 如何将全局变量传递给引用的程序集?,asp.net,.net,global-variables,Asp.net,.net,Global Variables,如何将全局变量传递给引用的程序集 我正在修改asp.net应用程序。需要记录所有员工(网站的当前用户)的操作,如保存新客户或更新发票数据。UI层正在调用引用的程序集BLL.dll 我想将当前雇员传递给引用的程序集。传递的Employee应该是该dll中所有静态方法的共享帐户。它应该是线程安全的,因为员工可以根据请求进行更改 我无法公开BLL中的静态字段,因为员工存储在会话状态 我需要一些不静态、全局、可由程序集(UI层和BLL.dll)访问的、线程安全的东西。 我正在考虑使用一些存储在当前线程对

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

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

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

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

我需要一些不静态、全局、可由程序集(UI层和BLL.dll)访问的、线程安全的东西。

我正在考虑使用一些存储在当前线程对象中的变量。但我不知道我到底应该做什么

有工作吗


谢谢

基本上,你的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
一次


然而,会话状态仅在请求上下文中足够好。如果您需要它在不同的线程上运行,则必须显式地将其传递到不同的线程。

很好的解决方案,它应该可以工作。我认为我们不再需要锁,因为会话是线程安全的。锁在那里,以防其他人试图设置实现。