2010-11-11 4 views
1

J'ai une classe basée sur l'interface que je veux avoir quelques classes statiques en tant que propriétés. Cependant, je n'arrive pas à trouver un moyen d'utiliser une classe statique en tant que propriété d'instance sur une classe basée sur une interface.Classe statique en tant que propriété d'instance

public interface IHttpHelp 
{ 
    ItemsManager {get;set;} 
} 

public static class ItemsManager 
{ 
    //static methods 
} 

public class HttpHelper 
{ 
    public ItemsManager { get { return ItemsManager;} 
} 

Le code ci-dessus ne fonctionnera pas à cause du "ItemsManager est utilisé comme une variable, mais c'est une erreur de type." Est-il possible d'utiliser une classe de cette façon? Pour avoir un aperçu de ce que je fais - j'ai quelques classes auxiliaires statiques qui accèdent au httpruntime et au contexte actuel. Je les utilise actuellement directement, mais je voulais passer à une classe de conteneur qui sera utilisé IoC. Je pourrais en faire des classes d'instance et oublier ça, mais je me demande s'il y a un moyen d'y arriver.

Répondre

9

Vous ne pouvez pas utiliser une classe statique comme celle-ci, car par définition vous ne pouvez pas en créer une instance, vous ne pouvez donc pas la renvoyer d'une propriété. Faire une place singleton:

public class ItemsManager 
{ 
    #region Singleton implementation 

    // Make constructor private to avoid instantiation from the outside 
    private ItemsManager() 
    { 
    } 

    // Create unique instance 
    private static readonly ItemsManager _instance = new ItemsManager(); 

    // Expose unique instance 
    public static ItemsManager Instance 
    { 
     get { return _instance; } 
    } 

    #endregion 

    // instance methods 
    // ... 
} 

public class HttpHelper 
{ 
    public ItemsManager ItemsManager { get { return ItemsManager.Instance; } } 
} 
+0

+1 pour le singleton :) –

+0

Voici ce que je redoutais:/Ce qui est le cas, je vais juste faire une classe d'instance, ce n'est pas une grosse affaire - juste une préférence. –

0

Ce n'est pas supporté par le langage directement. Vous pouvez écrire une classe proxy manuellement ou utiliser une bibliothèque telle que Duck Typing Project pour émettre une classe proxy lors de l'exécution.

Les deux auront le même résultat: vous aurez une classe qui implémente l'interface, et procèdera à tous les appels aux méthodes statiques de la classe statique. Que vous souhaitiez écrire vous-même ou utiliser la bibliothèque de dactylographie, c'est à vous de décider.

EDIT: La réponse de Thomas à l'utilisation d'un singleton serait la bonne façon de procéder, si vous avez cette option.

0

classes statiques ne peuvent pas implémenter des interfaces - il ne serait vraiment pas beaucoup de sens. Une interface fournit une API standard que toutes les instances prendront en charge et vous pouvez échanger des instances et accéder de manière polymorphique aux méthodes via l'interface standard. Avec une classe statique, toutes les références sont de toute façon à travers la classe.

Généralement, dans cette situation, vous souhaitez qu'une fabrique prenne en charge DI d'une classe d'instance qui implémente votre assistant.

public interface IHttpHelper 
{ } 

public class RealHttpHelper 
{ ... } 

public class FakeHttpHelper 
{ ... } 

public static class HttpHelper 
{ 
    public static IHttpHelper Instance 
    { 
     get 
     { 
      return whatever ? new RealHttpHelper() : new FakeHttpHelper(); 
     } 
    } 
} 

... 
HttpHelper.Instance.Context... 
... 
Questions connexes