| 

.NET C# Java Javascript Exception

2
Hi zusammen,

ich möchte mal eine sehr allgemeine Frage stellen.

Ich habe 2 UserControls: Control A mit einer Checkbox, Control B mit einem Panel das einen Schliessen-Button hat. Die Checkbox soll das Panel gemäß Ihrem eigenen Zustand ein- und ausschalten. Wird das Panel über seinen eigenen Schliessen-Button geschlossen soll der Status des Button angepasst werden. Ansonsten "grüne Wiese" ;-). Nehmen wir weiterhin an, dieses Szenario soll es in der Applikation n+1 mal geben. Nehmen nochmal an, es könnte weitere Controls geben, die irgendwas machen/anzeigen abhängig vom Status des Panels.

Wie sollte man das am besten umsetzen? Mein erster Ansatz:
- Einen statische Klasse in der alle Conrols registriert werden
- Die Modifier für den Button und das Panel auf internal setzen
- Eine Eigenschaft "PanelImControlBVisibility" in der statischen Klasse unterbringen die dann alle abhängigen Elemente steuert.

Der Ansatz ist aber wenig cool, da sich die Events anfangen gegenseitig zu ärgern. Ich müsste das CheckBoxCheckedChangedEvent der Checkbox und das PanelClosedEvent des Panels in der Eigenschaft "PanelImControlBVisibility" deregistrieren und am Ende wieder registrieren, was im besten Fall mühsam wird.

Im Kern geht es noch nicht mal primär um dieses spezielle Szenario, sondern darum, wo man genau solche sehr allgemeinen Architekturfragen nachschlagen kann. Meine bisherigen C# Bücher gehen immer nur auf spezielle Themen ein, genauso wie ja auch dieses Forum. Da ich als Consultant keine 30 Entwickler um mich habe die ich fragen kann, muss ich es irgendwie anders auf die Reihe bringen. Und studieren wollt ich mit 34 auch nicht mehr anfangen ;-)

gruss Dave
News:
06.03.2013
david.koenig09 153 5
3 Antworten
2
Um solche Probleme zu lösen habe ich ganz gute Erfahrungen mit der Implementierung eines Dispatchers gemacht. Ich habe dazu eine Singleton-Klasse geschrieben, welches Events zur Verfügung stellt, die von anderen Klassen zur Kommunikation verwendet werden können. Die grundsätzliche Implementierung sieht wie folgt aus:

public sealed class MessageDispatcher
{
public event EventHandler<MessageEventArgs> ShowMessage;

private static volatile MessageDispatcher mInstance;
private static readonly object mSyncRoot = new Object();

public static MessageDispatcher Instance
{
get
{
if (null == mInstance)
{
lock (mSyncRoot)
{
if (null == mInstance)
{
mInstance = new MessageDispatcher();
}
}
}
return mInstance;
}
}

public void Dispatch(string pMessage)
{
OnShowMessage(pSender, pEventArgs);
}

private void OnShowMessage(object pSender, MessageEventArgs pEventArgs)
{
if(ShowMessage != null)
{
ShowMessage(pSender ?? this, pEventArgs);
}
}
}


Um sich auf Nachrichten des Dispatchers zu registrieren wird einfach eine Event-Methode registriert.

MessageDispatcher.Instance.ShowMessage += MessageDispatcher_ShowMessage;


Über die Dispatch-Methode werden Nachrichten verteilt.

MessageDispatcher.Instance.Dispatch(Messages.InsertSuccess);


Das ganze kann belibieg um weitere Events und Dispatch-Methoden erweitert werden.

Der Vorteil dieser Lösung ist, dass die einzelnen Formulare und Klassen, welche den Mechanismus verwenden, voneinander entkoppelt sind. Ich möchte jedoch zwei Nachteile nicht verschweigen. Zum einen kann es zu Speicherlecks kommen, wenn die Events nicht korrekt deregistriert werden (dies könnte man aber durch Anwendung des WeakEvent-Patterns verhinder, siehe z.B. Weak-Events in C#). Zum Anderen habe ich die Erfahrung gemacht, dass diese Implementierung, wenn man sie intensiv nutzt, schwer zu debuggen ist.

Gruß
Klaus
07.03.2013
luedi 1,7k 1 9
1
Ich finde es immer wieder interessant in die Dokumentation und die Quellen von Prism rein zu schauen. Es handelt sich dabei zwar um ein WPF Framework, viele Grundideen können aber auch auf Windows Forms übertragen werden.

Die Komponente die dir bei deinem Eingangs erwähnten Problem helfen könnte, nennt sich bei Prism übrigens EventAggregator.
07.03.2013
Hendrik Lösch 1,5k 9
0
Cool super vielen Dank euch beiden, dass ist doch schon mal was, was mir weiter hilft. Dann werde ich mal spielen. Hoffe das sich weitere Mitleser nicht abhalten lassen, Ihre Ansätze vorzustellen...
07.03.2013
david.koenig09 153 5

Stelle deine .net-Frage jetzt!