Hi Leute,
ich wollte mal fragen, wie man obigen Sachverhalt elegant modellieren könnte.
Bsp:
Ich entwickle gerade einen MP3 Player, welcher in verschiedene Schichten aufgeteilt ist.
Bis jetzt gibt es drei Schichten:
Präsentationsschicht (Gui)
Applikationsschicht
Domänenschicht
In der Domänenschicht (dort ist zb. das ganze Player-Management) gibt es oftmals events, die Nachrichten an die GUI schicken sollen (z.b. der Fortschritt eines Tracks, welcher mit einem Slider angezeigt werden soll).
Nun wollte ich fragen, wie solche Nachrichten oder Events elegeant modelliert werden können (ohne z.b. eine zu große Kopplung der Schichten zu verursachen). Folgend meine "Lösung", welche zwar funktioniert, ich bin aber nicht sicher ob die wirklich okay ist. Zusammenfasssend benutze ich Technologien wie Delegates und das Observer-Pattern. Was mich stört ist, das bei diesem Ansatz eine Schicht schlichtweg übersprungen wird.
Gui-Klasse (Auszug) des WPF-Formulars (Präsentationsschicht):
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| public partial class Window1 : Window, IAudioPositionRegistrant { public Window1() { InitializeComponent(); PlaybackManager.Instance.Register(this); }
public delegate void SetSliderCallback(double percent);
[...]
public void SetSlider(double percent) { slider1.Value = percent; }
public void Notify(double percent) { SetSliderCallback callback = SetSlider; this.Dispatcher.Invoke(callback, new object[] { percent }); } } |
Interface IAudioPositionRegistrant
C#-Quelltext
1: 2: 3: 4:
| public interface IAudioPositionRegistrant { void Notify(double percent); } |
PlaybackManager-Klasse (Auszug) (Domänenschicht)
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| public class PlaybackManager { private IAudioPositionRegistrant Registrant { get; set; }
[...]
public void Register(IAudioPositionRegistrant r) { Registrant = r; }
void SongTracker_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker worker = (BackgroundWorker)sender;
while (!worker.CancellationPending) { double percent = Audio.CurrentPosition * 100 / Audio.Duration; Registrant.Notify(percent); Thread.Sleep(500); } } } |
Danke für eure Hilfe!
Lg,
mannyk
Moderiert von
Kha: Topic aus C# - Die Sprache verschoben am Do 10.02.2011 um 14:30