Статическое поле C# ASP.NET Thread Safe только для чтения

У меня есть следующий код в моем проекте ASP.NET

public sealed class IoC
{
    private static readonly IDependencyResolver resolver =
        Service.Get("IDependencyResolver") as IDependencyResolver;

    static IoC()
    {
    }

    private IoC()
    {
    }

    public static IDependencyResolver Container
    {
         get
         {
             return resolver;
         }
    }
}

public static class Service
{
    public static object Get(string serviceName)
    {
        // Code to create and return instance...
    }
}

Будет ли IoC.Container потокобезопасным?


person Emilian    schedule 02.03.2010    source источник


Ответы (2)


Инициализация статических полей является потокобезопасной: то есть среда выполнения .NET гарантирует, что ваше поле будет инициализировано в программе только один раз, независимо от того, сколько потоков обращается к нему и в каком порядке.

Как указывает Андрей, сам метод Service.Get должен быть потокобезопасным.

person Tim Robinson    schedule 02.03.2010
comment
Насколько я понимаю, Service.Get будет вызываться один раз для каждого домена приложения, поэтому каждый поток будет получать один и тот же экземпляр преобразователя, правильно ли это? - person Emilian; 03.03.2010
comment
Ваше поле private static readonly IDependencyResolver resolver будет инициализировано только один раз для каждого домена приложения, правильно. Внутри Get все еще можно сделать что-то небезопасное, но я думаю, это не то, о чем вы спрашиваете. - person Tim Robinson; 03.03.2010
comment
В Service.Get я только читаю тип преобразователя из web.config и использую Activator для получения экземпляра преобразователя этого типа. Но меня беспокоило то, что каждый поток, обрабатывающий мои запросы, использует один и тот же экземпляр преобразователя. - person Emilian; 03.03.2010
comment
Да, это безопасно. Кстати, разве вы не хотите вместо этого (IDependencyResolver) Service.Get("IDependencyResolver")? Я бы предпочел InvalidCastException, если что-то пойдет не так - ключевое слово as просто оставит вас с нулевой ссылкой. - person Tim Robinson; 03.03.2010

Сам IoC выглядит нормально, но вся структура не будет потокобезопасной, если resolver не является потокобезопасной. Если вы хотите иметь преобразователь для каждого потока, вы можете использовать атрибут [ThreadStatic]

person Andrey    schedule 02.03.2010
comment
Я хочу, чтобы все потоки использовали один и тот же экземпляр реализации преобразователя. - person Emilian; 03.03.2010