public class A
{
public MyObject MyObject { get; set; };
public void Validate(string userName, string password)
{
MyObject = GetMyObject(userName, password);
}
}
public class B
{
//hier die gesetzte Variable "MyObject" aus Klasse A verwenden
}
|
|
class Program
{
static void Main(string[] args)
{
A a = new A();
a.Validate("", "");
B b = new B();
}
}
public class A
{
public static string MyObject { get; set; }
public void Validate(string userName, string password)
{
MyObject = "xy";
}
}
public class B
{
public B()
{
Console.WriteLine(A.MyObject);
}
}
class Program
{
static void Main(string[] args)
{
A.GetInstance.Validate("user", "pw");
B b = new B();
}
}
public class A
{
private A()
{
}
public static A GetInstance
{
get
{
return Nested.Instance;
}
}
class Nested
{
static Nested()
{
}
internal static readonly A Instance = new A();
}
public string MyObject { get; private set; }
public void Validate(string userName, string password)
{
MyObject = "xy";
}
}
public class B
{
public B()
{
Console.WriteLine(A.GetInstance.MyObject);
}
}
|
|
|
Die statische Variante gefällt +1, gibt es Probleme wenn mehrere verschiedene Clients den Service benutzen und die statische Variable beschreiben? Ich muss dazu erwähnen, dass sich in dieser Variable (MyObject)Authentifizierungsinformationen befinden.
– Mario Priebe 16.03.2011
|
||
|
Nachfrage: Der Code läuft schon auf dem Client, oder? Der Server muss ja zustandslos sein.
– Jürgen Luhr 16.03.2011
|
||
|
sorry, werde gerade aus Euren Kommentaren nicht schlau: der Code (d.h. inklusive der statischen Variable!?) läuft auf dem Client, aber Mario sorgt sich, dass verschiedene Clients in Konflikt geraten könnten?
– Matthias Hlawatsch 16.03.2011
|
||
|
@Matthias: Aus seinen bisherigen Fragen gehe ich davon aus, dass er eine Authentifizierung über SOAP evt. mit dem SOAP-Header macht, die Benutzerinformationen einmalig einliest und bei jedem Service-Aufruf diese Benutzerinformationen mitgibt.
@Mario: Die Clients besitzen alle eine eigene Client-Instanz und können nicht in Konflikt geraten. – Jürgen Luhr 16.03.2011
|
||
|
@Jürgen: ok, wenn das so ist, dann ist das Singleton-Pattern hier völlig ausreichend (und meine Lösung, s.u., Overkill). Kannst Du noch kurz erklären, wofür Du die nested class brauchst, statt Instance direkt in A unterzubringen?
@Mario: Dein erster Kommentar hat mich verwirrt: verschiedene Clients = verschiedene Prozesse = kein Problem. Aber nimm die Singleton-Lösung. Eine statische Property aus einer Instanzmethode der selben Klasse heraus zu verändern wäre für mich eher ein code smell. – Matthias Hlawatsch 16.03.2011
|
||
|
Durch die Schachtelung (nested class) kann die Threadsicherheit ohne Lock() sichergestellt werden,denn wenn auf eine Instanzeigenschaft zugegriffen wird, dann wird per nested class immer auf die selbe Instanz zugegriffen.
– Jorgen Schumann 16.03.2011
|
||
|
@Matthias: Jorgen hat es schon erklärt. Ich habe diesbezüglich meine Antwort erweitert.
– Jürgen Luhr 16.03.2011
|
||
|
Besten Dank Euch! (die Frage könnte man doch eigentlich auch bewerten, oder ;))
– Mario Priebe 17.03.2011
|
||
|
|
|
Das geht leider nicht, weil ich in Klasse B die Informationen zu MyObjekt nicht habe bzw. sehr viele bestehende Instanziierungen erweitern müsste.
– Mario Priebe 16.03.2011
|
|
|