3 votes

Y a-t-il un problème à utiliser des références statiques en lecture seule pour une classe de service ?

J'ai hérité de ce morceau de code, et l'auteur original, pour une raison quelconque, aimait vraiment les références statiques en lecture seule.

J'ai décrit le schéma général ci-dessous, Quelles sont les ramifications de ces références statiques en lecture seule ?

public class DbAccess
{
    private static readonly ISomethingFactory = SomethingFactories.GetFactory("1");
    private static IThing1Dao Thing1Dao { get {return ISomethingFactory.Thing1Dao; }}
    private static IThing2Dao Thing2Dao { get {return ISomethingFactory.Thing2Dao; }}
}

public class SomethingFactories
{
   public static ISomethingFactory GetFactory(string key) 
   {
      switch(key)
      {
         case "...":
         return new SomeFactory();
      }
   }
}    

public class SomeFactory : ISomeFactory
{    
    public IThing1Dao Thing1Dao
    {
       get { return new Thing1Dao(); }
    }
}    

public class SomeService : ISomeService
{
    private static readonly IThing1Dao thing1Dao = DbAccess.Thing1Dao
    private static readonly IThing2Dao thing2Dao = DbAccess.Thing2Dao

    public Thing1Object1 GetObject1(int id)
    {
        return thing1Dao.GetObject1(id);    
    }

    public Thing1Object2 GetObject2(int id)
    {
        return thing1Dao.GetObject2(id);
    }
}

L'utilisation dans les pages .aspx est la suivante :

public class MyBasePage : System.Web.UI.Page
{
    protected static readonly SomeService someService = new SomeService();     
}    

public class SomeAspxPage : MyBasePage
{
   void btnAddObject1(...)
   {
      Thing1Object1 obj1 = someService.GetObject(1);
   }
}

3voto

Eric J. Points 73338

statique signifie qu'une seule instance de ISomethingFactory existe, et on peut accéder à cette instance par le biais du type (pas une instance par instance de DbAccess ).

en lecture seule signifie que, après l'initialisation, la valeur ne peut pas être écrasée.

Il s'agit d'un modèle assez normal pour effectuer une initialisation basée sur des données de démarrage (par exemple, des données provenant de app.config).

3voto

Guffa Points 308133

Les applications Web sont multithreads, les membres statiques sont donc d'une utilité limitée.

Si vous avez une référence statique à un objet, l'objet doit être thread safe, ou vous devez synchroniser son utilisation afin qu'un seul thread puisse l'utiliser à tout moment.

Le fait de rendre la référence statique en lecture seule signifie que la référence elle-même est thread safe, car elle ne peut pas être modifiée une fois qu'elle est définie, mais cela ne rend pas automatiquement l'objet qu'elle référence thread safe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X