ASP.NET - 存储常见的访问数据,例如设置,当前用户等

时间:2011-12-20 15:48:20

标签: asp.net

在我的应用程序中,我经常需要获取相同的信息(当前登录用户)并声明相同的服务(授权,设置等)。到目前为止,我通过在Global.asax文件中执行以下操作来解决此问题:

public class App : HttpApplication {
    private static IMembershipService _membershipService;
    public static IAuthorizationService Authorization;
    public static ISettingsService Settings;

    public static User CurrentUser {
        get { return HttpContext.Current.User.Identity.IsAuthenticated ? _membershipService.GetUser(((UserIdentity)HttpContext.Current.User.Identity).Id) : null; }
    }

    protected void Application_Start() {
        // Create the ioc container
        var container = new UnityContainer();

        ... Register Types Here

        _membershipService = container.Resolve<IMembershipService>();
        Authorization = container.Resolve<IAuthorizationService>();
        Settings = container.Resolve<ISettingsService>();
    }
}

现在要访问当前登录的用户,我只需要说App.CurrentUser。注意虽然它被声明为static,但get不会缓存到静态变量中,因此每个请求都不同。

我只是想知道这是否是一个很好的解决方案。有一些我不喜欢它,但我很欣赏一些ASP.NET专家的意见。

由于

2 个答案:

答案 0 :(得分:1)

这是滥用static关键字,特别是因为您使用的是IoC容器。

假设这是一个MVC应用程序,您只需要对容器进行非常有限的调用。主要调用是控制器工厂,它将从容器中解析控制器。可能还有其他几个地方可以打电话给承包商,但理想情况下只有一个。

如果这是webforms,您可以设置具有受保护只读属性的基类来解析ctor或page_init事件中的组件。不理想,但朝着正确的方向迈出了一步。

要考虑的另一件事是静态类意味着单身人士。在这种情况下,组件不能具有状态。否则你会遇到各种有共享状态和竞争条件的错误。

我发现最好尽可能多地使用瞬态物体,并且只能将它们保持一段时间。较低的内存消耗和对象可以根据其使用的上下文进行定制。

答案 1 :(得分:0)

我认为所有代码都属于Global.asax之外,最好是专用于用户管理的类。 UserManager课程,如果你愿意的话。 Global.asax中唯一应该是Application_Start中的方法调用来创建您的IOC容器。

但这是一个风格问题,而不是该方法的问题。方法本身很好。我个人不会为User返回null;我会坚持使用HttpContext.Current.User方法返回一个匿名实体用户类。但同样,这是一个风格问题。

我唯一担心的是Service后固定类实际上是WCF代理,它应该(可能)是短期对象而不是所有请求中维护的东西。如果我误读了你的代码,请忽略整段。 :)