当我收到Web API请求时,我想创建一个变量,在请求的生命周期中,每个类都可以访问该变量。我希望它可以像任何类的App.User
一样以静态属性的形式访问。但我不希望在处理请求后保留它,所以我猜SessionState不是一个选项。这样做的正确方法是什么?
编辑: 它也需要是线程安全的。
答案 0 :(得分:3)
如Igor所述,一个选项是使用依赖注入和参数传递来使“全局”变量可供所有需要它的人使用。
但是如果你真的想使用静态属性,那么你可以使用HttpContext.Items属性来存储与当前请求有关的临时数据:
public class App
{
public static IUser User
{
get { return (IUser)HttpContext.Current.Items["User"]; }
set { HttpContext.Current.Items["User"] = value; }
}
}
第三个选项(我不推荐)是使用ThreadStatic属性支持的静态字段:
public class App
{
[ThreadStatic]
private static IUser user;
public static IUser User
{
get { return user; }
set { user = value; }
}
}
此选项的优点是它不依赖于System.Web。但是,如果您的控制器是同步的,则仅有效,如果您使用async
,它将会中断。
答案 1 :(得分:1)
HttpContext.Items专门用于此目的。
您放入的任何内容都将存在当前请求的生命周期,然后在之后被拆除。