Этот метод потокобезопасен? - PullRequest
1 голос
/ 18 апреля 2011

Я использую инфраструктуру MVC2 и Unity2 в качестве контейнера IOC. Я разрешаю экземпляр IHttpContextLocatorService, используя Unity, как показано ниже.

  RootContainer.RegisterType<IHttpContextLocatorService, HttpContextLocatorService>(new ContainerControlledLifetimeManager());

Вышеприведенное дает мне "singleton" 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;
    }
}

1 Ответ

1 голос
/ 20 апреля 2011

Это потокобезопасно, если обе реализации IControllerLocatorService.GetController() и RequestContextLocator.GetCurrentRequestContext().

Если они с состоянием, они (и ваш метод, как следствие) могут быть не поточно-ориентированными.ИМО, у вас есть 2 варианта:

  • убедитесь, что оба эти метода являются потокобезопасными
  • сделать метод GetCurrentContext потокобезопасный блокирующий доступ к двум зависимостям
...