Ich brauche eine Singleton-Klasse, die mit einigen Argumenten instanziiert wird. Die Art und Weise, wie ich es jetzt tue, ist:
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...
}
}
Die Instanz wird "spät" erstellt, was bedeutet, dass ich beim Start der Anwendung nicht alle benötigten Argumente habe.
Im Allgemeinen mag ich es nicht, eine Reihenfolge von Methodenaufrufen zu erzwingen, aber hier sehe ich keine andere Möglichkeit. Das IoC würde es auch nicht lösen, denn wo ich es im Container registrieren kann, kann ich auch Create() aufrufen...
Halten Sie dies für ein gutes Szenario? Haben Sie eine andere Idee?
bearbeiten : I wissen dass das, was ich als Beispiel geschrieben habe, nicht thread-sicher ist, thread-sicher ist nicht Teil der Frage
0 Stimmen
Das ist no ein Singleton. Wo ist der gegenseitige Ausschluss? (d.h.
lock
). plus Ihregetter
für die Instanz sollte die Instanz erzeugen, nicht den Ctor - das ist der Sinn der Sache.0 Stimmen
Ich stimme mit RPM1984 überein, dass es sich nicht um ein Singleton handelt. Können sich Ihre Argumente ändern oder bleiben sie während der gesamten Lebensdauer Ihrer Anwendung gleich? Ein Singleton sollte nicht von einer Variablen abhängen, es könnte von der Konfiguration oder einem anderen Singleton abhängen. Wie auch immer, denken Sie wirklich über Ihren Entwurf nach und fragen Sie sich, ob Sie ein Singleton brauchen. Eine übermäßige Verwendung von Singletons ist wirklich schlecht für Ihr Design.
1 Stimmen
Es ist schon ein Einzelfall, glauben Sie mir :) die
getter
kann die Instanz nicht erstellen, da es keine Argumente hat - es könnte, aber es ist einfach bequemer, es so zu schreiben. Und die Argumente, einmal erhalten, ändern sich nicht.0 Stimmen
Woher kommen die Argumente?
0 Stimmen
@mastoj - von irgendeinem Dienstaufruf - es sind semistatische Daten, sie sind statisch, nachdem ich sie aufgerufen habe.
0 Stimmen
@veljkoz - vielleicht sollten Sie einen Proxy für diesen Dienst erstellen, der in diesem Fall auch ein Singleton ist? Anstatt also die Variablen zu übergeben, verwendet dein Singleton diesen Proxy, um deine Argumente zu erhalten, anstatt selbst übergeben zu werden. Ich mag die Idee nicht, Daten an ein Singleton zu übergeben. Natürlich sollten Sie die Implementierung Ihres Proxys direkt in Ihrem Singleton verwenden, stattdessen sollten Sie sich auf eine Extraktion des Proxys verlassen. Verstehen Sie, worauf ich hinaus will?
0 Stimmen
Mögliche Duplikate von C# Singleton mit Konstruktor, der Parameter annimmt