11
votes

Est-il possible d'envelopper un c # singleton dans une interface?

J'ai actuellement une classe dans laquelle je n'ai que des membres statiques et des constantes, mais je voudrais le remplacer par un singleton enveloppé dans une interface.

Mais comment puis-je faire cela, en gardant à l'esprit que chaque mise en œuvre du singleton que j'ai vu a une méthode d'instance statique, rompant ainsi des règles d'interface?


0 commentaires

4 Réponses :


6
votes

Vous pouvez faire tous les les autres membres de votre implémentation de votre singleton Membres correspondants dans une interface. Cependant, vous êtes correct que la propriété ne peut pas faire partie de l'interface car elle est (et doit rester) statique.


0 commentaires

10
votes

Une solution à considérer (plutôt que de laminer la main en vôtre) serait de tirer parti d'un conteneur de CIO par exemple. Unity .

Les conteneurs de la COI portent généralement en compte l'enregistrement d'une instance contre une interface. Ceci fournit votre comportement à votre singleton, car les clients résolvent contre l'interface recevront l'instance unique. P>

  //Register instance at some starting point in your application
  container.RegisterInstance<IActiveSessionService>(new ActiveSessionService());

  //This single instance can then be resolved by clients directly, but usually it
  //will be automatically resolved as a dependency when you resolve other types. 
  IActiveSessionService session = container.Resolve<IActiveSessionService>();


4 commentaires

Cela semble intéressant - dans votre exemple d'exemple, quel est le "conteneur"?


@Surfbutler 'Contener' est l'instance du conteneur de la COI. Dans ce cas, c'est un iunityContainer.


Merci Chibacité et qu'en est-il de 'ActiveesessService'? Est-ce un exemple de nom de classe singleton, ou une partie de l'unité? Désolé, mordu mord cérébral mort ce soir!


C'est juste un exemple de classe, remplacer par vous-même.



9
votes

Vous ne pouvez pas faire cela avec des interfaces car ils spécifient que des méthodes d'instance, mais vous pouvez la mettre dans une classe de base.

Une classe de base Singleton: P>

public void LameExampleMethod()
{
  Example.Instance.ExampleProperty++;
}


2 commentaires

Cette classe abstrait fonctionne pour moi. J'ai absolument fait un peu de changements: Classe abstraite publique Singleton Où T: Nouveau () {Statique privé T _Instance; Singleton privé () {} Public static T Instance {Obtenir {Si (Equalstance (_Instance, par défaut (t))) {_Instance = nouveau t (); } retour _Instance; }}}


CLASSType Instance = Nouveau CLASSTYPE () Peut être remplacé par paresseux instance = nouveau paresseux (() => nouveau classype ()) pour une exécution différée qui est utile lorsque votre classesType est coûteux à initialiser.



0
votes

Les interfaces ne peuvent pas avoir des instances dans C #, je pense que vous n'avez besoin que de:

Implémenter le modèle Singleton (Oui, vous aurez besoin d'un attribut ou d'une méthode statique pour obtenir l'instance, mais tout le reste ne nécessite pas d'être statique)

D'autre part, votre singleton peut implémenter une interface si vous le souhaitez, rappelez-vous simplement que d'autres classes peuvent également mettre en œuvre cette même interface


0 commentaires