在我的应用程序中,我经常需要获取相同的信息(当前登录用户)并声明相同的服务(授权,设置等)。到目前为止,我通过在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专家的意见。
由于
答案 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代理,它应该(可能)是短期对象而不是所有请求中维护的东西。如果我误读了你的代码,请忽略整段。 :)