Hallo alle zusammen,
Ich brauch mal wieder euren werten Rat. Entweder bin ich schon wieder zu restriktiv oder ich verstehe etwas noch nicht ganz.
Folgendes Szenario:
[highlight=c#]
public class Module
{
public String Description { get; set; }
public IList<Teststep> Teststeps { get; set; }
}
public class Teststep
{
public double UpperLimit { get; set; }
public double LowerLimit { get; set; }
}
[/highlight]
Eine Instanz der Klasse Module würde ich nun gerne in einem Fenster darstellen. Es soll eine Windows Forms Anwendung werden. Ich hatte mir vorgestellt im oberen Bereich ein Panel für die Properties des Moduls und darunter ein DataGridView für die Teststeps. Auf DataBinding möchte ich gerne verzichten. Das ist mir nicht flexibel genug.
Also definiere ich folgende Interfaces:
[highlight=c#]
public interface IModuleView
{
String DescriptionText { get; set; }
ITeststepView CreateTeststepView();
void AddTeststepView(ITeststepView view);
}
public interface ITeststepView
{
String UpperLimit { get; set; }
String LowerLimit { get; set; }
}
[/highlight]
Hierzu meine Fragen:
1. Ist die Vorgehensweise mit dem Create/Add-TeststepView richtig? Meine Lösung basiert darauf, dass der Presenter ja nicht entscheiden kann welchen View er instantiieren muss. Also fragt er den ModuleView was er als View für den Teststep verwenden soll.
2. Wie reiche ich das eigentliche Objekt durch? Soll ich IModuleView noch eine Property hinzufügen? So in etwa?
[highlight=c#]
public interface IModuleView
{
...
Module ShownModule { get; set; }
...
}
[/highlight]
Das würde allerdings wieder das Prinzip verletzen, dass der View nichts von seinem Model weiss.
Eine zweite Alternative wäre es den Presenter zur Laufzeit per Dependency Injection zu erzeugen und diesem im Konstruktor das Modul-Objekt mitzugeben.
Die dritte Alternative wäre es dem Presenter eine Schnittstelle (z.B. IModuleDal) mitzugeben und dem View nur die Id des anzuzeigenden Moduls mitzugeben. So in etwa:
[highlight=c#]
public interface IModuleView
{
...
Int64 ShownModuleId { get; set; }
...
}
[/highlight]
Der Presenter würde daraufhin ein Query auf die Datenbank absetzen und sich das Objekt selbst holen. Da ich allerdings das Objekt normalerweise schon habe (es gibt so etwas wie einen Open Dialog) macht es imho nicht viel Sinn dort noch einen Datenbank Zugriff zu fahren. Das Problem stellt sich ausserdem bei den Teststeps auch wieder, da ich die Teststeps auf jeden Fall alle habe sobald das Modul aus der DB geladen wurde
Das ganze bereitet mir schon seit einigen Wochen kopfzerbrechen und ich komme einfach nicht dahinter wie ich das am Besten löse.
Wahrscheinlich bin ich einfach wieder zu ehrgeizig und suche nach der zu perfekten Lösung Mich würde allerdings eure Meinung zu dem Thema interessieren.
Vielen Dank schon mal an alle!!!
Gruß,
fanderlf
Ich brauch mal wieder euren werten Rat. Entweder bin ich schon wieder zu restriktiv oder ich verstehe etwas noch nicht ganz.
Folgendes Szenario:
[highlight=c#]
public class Module
{
public String Description { get; set; }
public IList<Teststep> Teststeps { get; set; }
}
public class Teststep
{
public double UpperLimit { get; set; }
public double LowerLimit { get; set; }
}
[/highlight]
Eine Instanz der Klasse Module würde ich nun gerne in einem Fenster darstellen. Es soll eine Windows Forms Anwendung werden. Ich hatte mir vorgestellt im oberen Bereich ein Panel für die Properties des Moduls und darunter ein DataGridView für die Teststeps. Auf DataBinding möchte ich gerne verzichten. Das ist mir nicht flexibel genug.
Also definiere ich folgende Interfaces:
[highlight=c#]
public interface IModuleView
{
String DescriptionText { get; set; }
ITeststepView CreateTeststepView();
void AddTeststepView(ITeststepView view);
}
public interface ITeststepView
{
String UpperLimit { get; set; }
String LowerLimit { get; set; }
}
[/highlight]
Hierzu meine Fragen:
1. Ist die Vorgehensweise mit dem Create/Add-TeststepView richtig? Meine Lösung basiert darauf, dass der Presenter ja nicht entscheiden kann welchen View er instantiieren muss. Also fragt er den ModuleView was er als View für den Teststep verwenden soll.
2. Wie reiche ich das eigentliche Objekt durch? Soll ich IModuleView noch eine Property hinzufügen? So in etwa?
[highlight=c#]
public interface IModuleView
{
...
Module ShownModule { get; set; }
...
}
[/highlight]
Das würde allerdings wieder das Prinzip verletzen, dass der View nichts von seinem Model weiss.
Eine zweite Alternative wäre es den Presenter zur Laufzeit per Dependency Injection zu erzeugen und diesem im Konstruktor das Modul-Objekt mitzugeben.
Die dritte Alternative wäre es dem Presenter eine Schnittstelle (z.B. IModuleDal) mitzugeben und dem View nur die Id des anzuzeigenden Moduls mitzugeben. So in etwa:
[highlight=c#]
public interface IModuleView
{
...
Int64 ShownModuleId { get; set; }
...
}
[/highlight]
Der Presenter würde daraufhin ein Query auf die Datenbank absetzen und sich das Objekt selbst holen. Da ich allerdings das Objekt normalerweise schon habe (es gibt so etwas wie einen Open Dialog) macht es imho nicht viel Sinn dort noch einen Datenbank Zugriff zu fahren. Das Problem stellt sich ausserdem bei den Teststeps auch wieder, da ich die Teststeps auf jeden Fall alle habe sobald das Modul aus der DB geladen wurde
Das ganze bereitet mir schon seit einigen Wochen kopfzerbrechen und ich komme einfach nicht dahinter wie ich das am Besten löse.
Wahrscheinlich bin ich einfach wieder zu ehrgeizig und suche nach der zu perfekten Lösung Mich würde allerdings eure Meinung zu dem Thema interessieren.
Vielen Dank schon mal an alle!!!
Gruß,
fanderlf
Comment