2010-12-13 6 views
2

Ich habe eine Beispielanwendung erstellt, um einige Funktionen von wpf zu testen und auszuprobieren. Ich habe im Grunde die Datenbindung in WPF ausprobiert und den Rest der Dinge mehr oder weniger schnell erledigt. Dann stand ich vor einem architektonischen Problem (ja, sollte vorher gedacht haben, bevor ich mit der Programmierung begann :)) und ich wollte wissen, was die beste Refactoring-Lösung dafür ist.Architekturfrage bezüglich der Implementierung und Erweiterbarkeit von Schnittstellen

Ich habe eine einfache Schnittstelle, die eine Liste von Objekten basierend auf einem definierten Prozess zurückgibt.

public interface IDoStuff<out T> 
    { 
     IEnumerable<T> Do(string someParam); 
     } 

Ich habe ein paar Implementierungen für diese Schnittstelle erstellt. Dann habe ich einen Blick in wpf, die ein Dropdown mit fest codierten Werte hat, und je nachdem, was Sie wählen, instatiates die Implementierung der Schnittstelle und füllt eine Liste

foreach (var item in new IDoSTuffImplementation1()<MyObj>.Do("imp 1")) 
{ 
    MyObjs.Add(item); 
} 

ater auf MYOBJS die Datacontext für eine Listenansicht ist, und zeigt Dinge und so weiter und so weiter, aber es ist außerhalb der Hauptfrage.

das ist alles hart codiert und nicht sehr nett. Wenn ich jemals eine neue Schnittstelle implementieren würde, müsste ich sie zum Dropdown hinzufügen und eine neue foreach für diese spezifische Implementierung erstellen (mehr duplizierten Code)

Ok, hier ist mein Eindruck auf dieses bessere/Refactoring für Erweiterbarkeit. Ich dachte, ein guter Ansatz wäre, eine Art von MVVM-Muster zu verwenden, die WPF-Ansicht zu einem View + Viewmodel zu machen. Das Viewmodel würde eine Art IoC-ähnliches Spring verwenden, welches (durch xml) eine bestimmte Implementierung der Schnittstelle instanziiert und es in das Viewmodel einfügt, welches dann seine "Do" -Methode aufrufen würde und alle glücklich wären. Auf diese Weise müssen wir nur dann, wenn wir eine neue Komponente implementieren, diese zur XML-Konfigurationsdatei hinzufügen. Vorschläge, Kommentare? Was ist der beste Ansatz, wenn überhaupt? danke !!

Antwort

0

Ich schlage vor, Sie ändern Sie Method zu einem Property stattdessen. Und weisen Sie diese Eigenschaft der Eigenschaft ComboBoxItemsSource zu, um Ihre Codierung mit Datenbindung zu erleichtern.

+0

das hilft wirklich nicht viel, meine Hauptfrage wird auf die Architektur (und die vorgeschlagene Erweiterung), nicht, wie man die Datenbindung machen. –

+0

Sie haben MVVM erwähnt und deshalb habe ich vorgeschlagen, dass Sie eine "Eigenschaft" anstelle einer "Methode" verwenden. MVVM basiert auf 'Notifications',' Data Binding' und 'Commands'. Verwenden Sie 'Unity' oder' MEF' als 'IoC'. – decyclone

1

Tatsächlich sehe ich keine Architekturänderungen, wenn Sie eine andere Implementierung der Schnittstelle bereitstellen. Sie verfügen bereits über eine gute Architektur, wenn Sie MVVM verwenden. Die Aufgabe, die Sie ausführen möchten, ändert die Architektur nicht, sondern erweitert Ihre Anwendung um die Architektur.

+0

Ja, aber im aktuellen Fall erhält der Konstruktor einen IWorker . In dem vorgeschlagenen Szenario würde ich etwas wie ein Dictionary > oder etwas ähnliches benötigen, um basierend auf dem Befehl zwischen den entsprechenden Implementierungen wechseln zu können. Aber hier hätte ich einen Code, der sehr spezifisch für diesen Schalter ist, entweder in den Schaltflächenbefehlen oder in einer switch-Anweisung oder was auch immer, um zu überprüfen, welche Implementierung angewendet werden sollte. und ich denke, die idee des mvvm ist es, dies unter anderem zu vermeiden? –

+1

hmm ... Vielleicht können Sie die IWorker-Objekte in der VM verfolgen und CommandParameter verwenden, um den IWorker der Schaltfläche zu identifizieren. Wenn Ihnen die Idee, alle IWorker-Implementierungen beizubehalten, nicht guttun, können Sie VM immer in Code hinterher initialisieren und einen VM-Konstruktor erstellen, der das Array von IWorker-Objekten akzeptiert. – Davita

Verwandte Themen