2010-03-02 37 views
8

我在ASP.NET项目C#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将是线程安全的?

回答

1

静态字段的初始化是线程安全的:也就是说,.NET运行时保证你的字段只会在程序中被初始化一次,不管有多少个线程以什么顺序访问它。

正如Andrey指出的那样,Service.Get方法本身需要是线程安全的。

+0

从我的理解Service.Get将被调用一次每个应用程序域,所以每个线程将收到相同的解析器实例是否正确? – Emilian 2010-03-02 22:36:30

+1

您的“私有静态只读IDependencyResolver解析器”字段将仅在每个应用程序域中初始化一次,为正确。在'Get'内部仍然有可能做不安全的事情,但我想这不是你要求的。 – 2010-03-02 22:43:13

+0

In Service.Get我只从web.config读取解析器类型,并使用Activator获取该类型的解析器实例。但我担心的是,处理我的请求的每个线程都使用相同的解析器实例。 – Emilian 2010-03-02 22:46:02

0

IoC本身看起来不错,但如果resolver不是线程安全的,则整个结构将不会线程安全。如果你想拥有每个线程的解析器,你可以使用属性[ThreadStatic]

+0

我想所有的线程使用相同的实例resolver实现 – Emilian 2010-03-02 22:30:12