2010-03-02 69 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