我正在使用MVC2框架和Unity2作为IOC容器。我使用Unity解决了IHttpContextLocatorService实例,如下所示。
RootContainer.RegisterType<IHttpContextLocatorService, HttpContextLocatorService>(new ContainerControlledLifetimeManager());
上面给出了HttpContextLocatorService的“单例”。
GetCurrentContext()函数已被我们的应用程序中的许多地方调用。我担心GetCurrentContext()不是线程安全。测试这个并不容易,因为我无法重新创建由各种RequestContext和Controller等组成的多个线程。
有人可以建议方法“GetCurrentContext()”是否是线程安全的?
public class HttpContextLocatorService : IHttpContextLocatorService
{
[Dependency]
public IControllerLocatorService ControllerLocator { get; set; }
[Dependency]
public IRequestContextLocatorService RequestContextLocator { get; set; }
public HttpContextBase GetCurrentContext()
{
Controller controller = null;
try
{
controller = this.ControllerLocator.GetController(this.RequestContextLocator.GetCurrentRequestContext()) as Controller;
}
catch { }
if (controller == null)
{
return new HttpContextWrapper(HttpContext.Current);
}
return controller.HttpContext;
}
}
答案 0 :(得分:1)
IControllerLocatorService.GetController()
和RequestContextLocator.GetCurrentRequestContext()
的两种实现都是线程安全的。
如果他们是有状态的(他们的方法因此而言)可能不是线程安全的。 IMO你有两个选择:
GetCurrentContext
方法对两个依赖项进行线程安全锁定访问