2010-03-02 14 views
8

Ich habe den folgenden Code in meinem ASP.NET-ProjektC# ASP.NET Thread-sicher statische Nur-Lese-Feld

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... 
    } 
} 

Ist IoC.Container Thread-sicher sein?

Antwort

1

Die Initialisierung von statischen Feldern ist Thread-sicher: Das heißt, die .NET-Laufzeit garantiert, dass Ihr Feld nur einmal im Programm initialisiert wird, egal wie viele Threads darauf zugreifen und in welcher Reihenfolge.

Als Andrey weist darauf hin, die Service.Get Methode selbst braucht Thread-sicher zu sein.

+0

Von meinem Verständnis Service.get einmal jeder Thread die gleiche Resolver Instanz dies richtig ist erhalten so pro Anwendungsdomäne aufgerufen wird benutzen? – Emilian

+1

Ihr 'private static readonly IDependencyResolver-Resolver'-Feld wird nur einmal pro App-Domäne korrekt initialisiert. Es ist immer noch möglich, etwas unsicheres in 'Get' zu tun, aber das ist nicht das, was du fragst. –

+0

In Service.Get Ich lese nur Resolver-Typ von web.config und verwenden Sie Activator, um eine Resolver-Instanz dieses Typs zu erhalten. Aber meine Sorge war, dass jeder Thread, der meine Anfragen bearbeitet, dieselbe Resolver-Instanz verwendet. – Emilian

0

IoC selbst sieht gut aus, aber die gesamte Struktur ist nicht threadsicher, wenn resolver nicht threadsicher ist. Wenn Sie einen Resolver pro Thread haben möchten, können Sie das Attribut [ThreadStatic] verwenden

+0

Ich möchte alle Threads die gleiche Instanz von Resolver Umsetzung – Emilian

Verwandte Themen