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. P>
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? P>
4 Réponses :
Vous pouvez faire tous les les autres membres em> de votre implémentation de votre singleton Membres correspondants dans une interface. Cependant, vous êtes correct que la propriété code> ne peut pas em> faire partie de l'interface car elle est (et doit rester) statique. P>
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>();
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.
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++; }
Cette classe abstrait fonctionne pour moi. J'ai absolument fait un peu de changements: Classe abstraite publique Singleton
CLASSType Instance = Nouveau CLASSTYPE () CODE> Peut être remplacé par
paresseux
classesType code> est coûteux à initialiser.
Les interfaces ne peuvent pas avoir des instances dans C #, je pense que vous n'avez besoin que de: p>
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) p>
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 p>