J'ai besoin d'une classe singleton pour être instanciée avec certains arguments. La façon dont je le fais maintenant:Singleton avec paramètres
class SingletonExample
{
private SingletonExample mInstance;
//other members...
private SingletonExample()
{
}
public SingletonExample Instance
{
get
{
if (mInstance == null)
{
throw new Exception("Object not created");
}
return mInstance;
}
}
public void Create(string arg1, string arg2)
{
mInstance = new SingletonExample();
mInstance.Arg1 = arg1;
mInstance.ObjectCaller = new ObjectCaller(arg2);
//etc... basically, create object...
}
}
L'instance est créé « fin », ce qui signifie que je n'ai pas tous les arguments nécessaires au démarrage de l'application.
En général je n'aime pas forcer une commande d'appels de méthode, mais je ne vois pas d'autre moyen ici. L'IoC ne le résoudrait pas non plus, puisque je peux l'enregistrer dans le conteneur, je peux aussi appeler Create() ...
Considérez-vous cela comme un bon scénario? Avez-vous une autre idée?
modifier: Je sais que ce que j'ai écrit comme un exemple, il est pas thread-safe, thread-safe ne fait pas partie de la question
qui n'est pas un singleton. où est l'exclusion mutuelle? (c'est-à-dire 'lock'). plus votre 'getter' pour l'instance devrait être la création de l'instance, pas le ctor - c'est tout le point. – RPM1984
Je suis d'accord avec RPM1984, ce n'est pas un singleton. Vos arguments peuvent-ils changer ou seront-ils les mêmes pendant toute la durée de votre demande? Un singleton ne devrait pas dépendre de quelque chose de variable, cela pourrait dépendre de la configuration ou d'un autre singleton. Cependant, réfléchissez bien à votre conception et demandez-vous si c'est un singleton dont vous avez besoin. Plus d'utiliser singletons est vraiment mauvais pour votre conception. –
C'est bien singleton, croyez-moi :) le 'getter' ne peut pas créer l'instance car il n'a pas d'arguments - il aurait pu, mais c'est plus pratique de l'écrire comme ça. Et, les arguments, une fois obtenus ne changent pas. – veljkoz