由于您已经将对象存储在 HttpContext.User 属性中,因此您真正需要的是实现您的目标的静态方法:-
public static class MySpecialContext
{
public static CommunityPrinciple Community
{
get
{
return (CommunityPrinciple)HttpContext.Current.User;
}
}
}
现在你可以得到社区原则:-
var x = MySpecialContext.Community;
但是,似乎要避免很多努力:-
var x = (CommunityPrinciple)Context.User;
另一种方法是 HttpContext 上的扩展方法:-
public static class HttpContextExtensions
{
public static CommunityPrinciple GetCommunity(this HttpContext o)
{
return (CommunityPrinciple)o.User;
}
}
使用它:-
var x = Context.GetCommunity();
这很整洁,但需要您记住在需要它的每个文件的 using 列表中包含定义扩展类的名称空间。
编辑:
让我们暂时假设您有一些非常好的理由为什么即使在上面调用的代码内部执行的演员表仍然不可接受(顺便说一句,我真的很想了解是什么情况导致您得出这个结论)。
另一种选择是 ThreadStatic 字段:-
public class MyModule : IHttpModule
{
[ThreadStatic]
private static CommunityPrinciple _threadCommunity;
public static CommunityPrinciple Community
{
get
{
return _threadCommunity;
}
}
// Place here your original module code but instead of (or as well as) assigning
// the Context.User store in _threadCommunity.
// Also at the appropriate point in the request lifecyle null the _threadCommunity
}
用 [ThreadStatic] 修饰的字段将具有每个线程的一个存储实例。因此,多个线程可以修改和读取 _threadCommunity,但每个线程都将在其特定的字段实例上进行操作。