Laden...

[gelöst] Verständnis Frage MVP-Pattern Design Umsetzung

Erstellt von Stipo vor 15 Jahren Letzter Beitrag vor 14 Jahren 4.407 Views
Stipo Themenstarter:in
699 Beiträge seit 2007
vor 15 Jahren
[gelöst] Verständnis Frage MVP-Pattern Design Umsetzung

Hallo zusammen,

ich brauche mal eure Hilfe bei der Umsetzung des MVP-Pattern.

Derzeit habe ich mein Programm folgend aufgebaut:
-- Model-Schicht = Klassenbibliothek (dll)
-- View-Schicht = Assembly (exe)
-- Presenter-Schicht = Klassenbibliothek (dll)

Hier mal die Main Methode, wie ich den Presenter und die View Instanziere:


static class Program
    {
        /// <summary>
        /// Der Haupteinstiegspunkt für die Anwendung.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            IMainForm mainForm = new MainForm();
            MainFormPresenter presenter = new MainFormPresenter(mainForm);
            
            Application.Run();
        }
    }

Ich übergebe ja die Instanz der MainForm an den Presenter, so das ich im Presenter dann die Form anzeigen lassen kann (form.Show()).

Nun ist mir aber aufgefallen, das diese Aufteilung nicht gerade optimal ist, denn wenn ich im Presenter ein neues Fenster instanzieren will, kennt der ja nicht die Form-Klasse, da diese in der Assembly liegt.
Dann müsste ich ja jede Form Klasse in der Main Methode instanzieren und dem Presenter mitteilen, was bei 3-4 Fenster sicher noch gehen würde. Aber sobald das mehr werden, ist das doch nicht mehr optimal.

Daher meine Frage dazu:
Kann es sein, das ich da einen Denkfehler hatte beim Design?
Sollte ich besser den Presenter in die Assembly packen und die View-Schicht dann in eine Dll?
So würde sich mein Problem, das ich die app.config auch nicht im Presenter nutzen kann auch von selbst lösen ( anderer Thread, aber bis jetzt ohne erfolg meinerseits ).

Würde mich einfach interessieren, wie Ihr das so löst, bzw wo ich noch mal mein Design am besten überden soll/kann.

Grüße Stephan

2.760 Beiträge seit 2006
vor 15 Jahren

Du brauchst im Presenter zusätzlich ein mapping welches dir konkrete Form-implementierungen für z.B. ein spezielles Objekt oder einen objektgraphen aus dem Model bereitstellt (Factory/Microkernel).

Der Microkernel wird konfiguriert z.B. in einem Xml-File in welchem zu jedem Business-objekt eine passende Ansicht definiert ist.

Wenn der Benutzer nun von seiner Hauptform eine Query an das Model schickt dann geht das über den Presenter und der gibt die Daten wieder an das View (z.B. in ein Grid). Wenn der Benutzer nun z.B. aus dem Grid die Detailansicht des angefragten Objekts aufruft so bekommt der Presenter das mit und schaut in seiner Konfiguration nach welche Form für die Darstellung des Objekts benötigt wir und instanziert diese.

Einige Microkernel implementierungen und Ansätze kannst du hier im Forum finden.

Sollte ich besser den Presenter in die Assembly packen und die View-Schicht dann in eine Dll?

Formsache: In .Net ist eigentlich alles ein Assembly.

Stipo Themenstarter:in
699 Beiträge seit 2007
vor 15 Jahren

Hallo Jaensen,

danke erstmal für den Hinweiß auf das Factory-Pattern und dem ansatz mit dem Microkernel. Dies ist sicher eine der besten Lösungen, die Du mir da gegeben hast (kann es nur bedingt beurteilen, da ich die Technik noch nicht behersche).

Nur möchte ich im moment nicht noch ein zusätzliches Pattern lernen, sondern versuchen das MVP-Pattern richtig zu beherschen, so das ich später wenn die Projekte größer und umfangreicher werden, damit sicher umgehen kann. ( Ich möchte mir auch noch das O´Reily Buch "Entwurfsmuster von Kopf bis Fuss" zulegen )

Wenn der Benutzer nun von seiner Hauptform eine Query an das Model schickt dann geht das über den Presenter und der gibt die Daten wieder an das View (z.B. in ein Grid). Wenn der Benutzer nun z.B. aus dem Grid die Detailansicht des angefragten Objekts aufruft so bekommt der Presenter das mit und schaut in seiner Konfiguration nach welche Form für die Darstellung des Objekts benötigt wir und instanziert diese.

Ich versuche eine Passiv-View MVP umsetzung. Dazu reiche ich die Klicks der User in der View durch einen Event an den Presenter, der dann ja für die Datenzugriffe ins Model und das weiter reichen ins View zuständig ist. Soweit hab ich das auch verstanden und schon umgesetzt, was auch tatellos klappt.
Ich bin nur eben über das unterbringen der einzelnen Schichten jetzt etwas unsicher, da ich festgestellt habe, dass ich ja dem Presenter dann die Forms bekannt geben muss in der View Schicht.

Ist jetzt nicht böse gemeint, aber meine eigentliche Frage, hast Du für mein wissenstand nicht hinreichend beantwortet. Daher bleibt für mich die Frage, sollte der Presenter in die Assembly.exe oder Assembly.dll rein, offen.

Trotzdem noch dankend, da ich solches Wissen immer trotzdem noch aufsauge und speichere.

Grüße Stephan

PS: Mir ist bekannt, das in Net alles als Assembly bezeichnet wird, daher hatte ich in klammern dahinter die endung geschrieben, das es nicht verwirrt was ich meine 😃

H
154 Beiträge seit 2007
vor 15 Jahren

ist der presenter auch für andere projekte nutzbar? wenn ja, in eine dll. alles gehört in eine dll was irgendwie austauschbar oder wiederverwendbar ist.
(und immer brav gegen schnittstellen programmieren..)

Stipo Themenstarter:in
699 Beiträge seit 2007
vor 15 Jahren

ist der presenter auch für andere projekte nutzbar? wenn ja, in eine dll. alles gehört in eine dll was irgendwie austauschbar oder wiederverwendbar ist.
(und immer brav gegen schnittstellen programmieren..)

Nein der Presenter ist in dem Fall spezifisch. Ich möchte nur die View in dem Fall austauschbar machen. Daher denke ich, das ich in dem Fall, bis ich mal die anderen Pattern (Factory) kenne, den Presenter in die exe packe.

Klar ist das View gegen eine Schnittstelle programmiert

2.760 Beiträge seit 2006
vor 15 Jahren

Grundsätzlich find ich ist ein Pattern wie MVP in Windows-Forms schwierig umzusetzen, das ist !meiner Meinung! nach eher was für Web-Geschichten da dort sowieso schon alles Lose verbunden ist (bedingt durch das HTTP-Protokoll).

In meinen Augen wirst du um so eine Factory/Kernel nicht rumkommen wenn du die Trennen strikt durchziehen möchtest. Ist also quasi eine Vorraussetzung für die Umsetzung.

Deine Anwendung ist eigentlich nur ein Host-Prozess. Die Ansichten, der Presenter und auch das Modell gehören in libraries (also DLLs) die dynamisch (evtl. ausgenommen den Presenter) in deinen Host-Prozess geladen werden und das am besten in eigene AppDomains.
Die Kommunikation zwischen den App-Domains (also dann den Schichten) würde dann z.B. über Remoting laufen.

Du solltest dich da nicht zu sehr auf die drei Schichten beschränken da diese nur grob das Konzept vorgeben aber auch in sich noch mal unterteilt sind.

Stipo Themenstarter:in
699 Beiträge seit 2007
vor 15 Jahren

Okay, ich sehe schon, ich brauche noch eine Bettlektüre 😃

Werde mir das Pattern mal ansehen. Vieleicht ist es ja nicht so schwer umzusetzen, bzw zu verstehen.

Danke nochmal

Grüße Stephan

2.760 Beiträge seit 2006
vor 15 Jahren

Wirklich schwer ist es nicht. Du kannst aber auch einfach einen fertigen Microkernel benutzen.

H
154 Beiträge seit 2007
vor 15 Jahren

@jansen,
nur so aus reiner neugier: wo kriegt man einen fertigen m-kernel?

2.760 Beiträge seit 2006
vor 15 Jahren
F
10.010 Beiträge seit 2004
vor 15 Jahren

@jaensen:
Warum sollte das umsetzen von MVP in WindowsForms schwieriger sein, als in Web?

@HappyLil:
Die nennen sich ganz selten Microkernel, da das eigentlich auch der falsche ansatz wäre.
http://www.codeplex.com/CommonServiceLocator
Hier ist mal eine Lib, die dir diese Funktionalitäten für einige der bekannteren
DI/IOC Container ( so nennen sich die meisten ) verallgemeinert anbietet.

@Stipo:
Eine std. Implementation für WindowsForms gibt es von MS, und die nennt sich
SCSF ( Smart Client Software Factory ).
Für WPF wäre etwas vergleichbares das Composite Application Guidance for WPF and Silverlight

Stipo Themenstarter:in
699 Beiträge seit 2007
vor 15 Jahren

@Jaensen,
ich verstehe jetzt, warum Du meintest, das ich um einen Microkernel nicht rum kommen werde. Ich habe mir gestern den Webcast von Ralf Westphal angesehen, darin erklärt sich für mich der Sinn.
Durch das Dynamische Mapping kann ich die statische Bindung der Assemblys übergehen. Auch fand ich den beitrag allgemein recht Interessant zwecks Test der Komponenten etc.

@FZelle,
danke für die Links und die ausführungen. Nur leider ist mein Englisch etwas kränklich (ja ich weiß, sollte das wohl mal lernen) aber dadurch verstehe ich immer nur Bruchteile, und muss den rest zusammen reimen.

@All
Meine Idee ist derzeit, das ich mir einen eigenen Micro Microkernel bauen möchte. Auch schon aus dem Aspekt des lernen, denn mit fertigen sachen kann jeder was bauen was funktioniert, aber ob man das dahinter versteht ist manchmal zweifelhaft.
Und ich mag nicht nur ein Klicki-Bunti Hobby Programmierer sein, daher möchte ich auch das dahinter lernen.

Jetzt komm ich aber zu meinem Problem. Ich finde im moment keinen anfang, wo ich anfangen soll oder muss. Die grundstruktur ist mir denke ich mal klar. Ein Microkernel ist aufzubauen wie ein Factory-Pattern (zumindest meine ich das aus dem Webcast heraus gelesen zu haben).

Ich hab aber noch defizide in folgenden Implementierungen (Wissenstechnisch):
-- Wie man eine App.config auslesen kann ( configSection ) ( verstehe ich noch nicht so ganz im allgemeinen, wie ich System.Configuration verwenden muss, um eine App.config zu lesen )
-- Wie ich eine Assembly dann dynamisch laden kann ( noch gar keine Idee )

Irgendwie drehe ich mich da gerade im Kreis. Über ein paar kleine Hilfen/Anregungen/Links zu guten Tutorials oder so würde ich mich freuen.

dankende Grüße
Stephan

F
10.010 Beiträge seit 2004
vor 15 Jahren

Sorry das zu sagen, aber dir fehlen da ja eigenlich noch die echten Grundlagen,
und dann willst Du dich an einem eigenen MicroKernel versuchen?

Wäre es nicht sinnvoll erstmal das mit den Grundlagen zu machen?

Stipo Themenstarter:in
699 Beiträge seit 2007
vor 15 Jahren

Was meinst Du mit echten Grundlagen? Meinst aber nicht die 1200 Seiten Visual C# 2008 von Kühnel?

Wenn ja, dann kann ich dir sagen, das ich dieses Buch direkt vor meiner Nase habe, und auch schon komplett durchgearbeitet habe.
Aber leider vermittelt das Buch auch nicht jeden Teil des Frameworks, bzw muss man mit dem wissen was darin steht auch erst mal umgehen können.

Ansonsten konnte ich schon viele meiner Probleme mit hilfe der Forensuche und dem Buch und einigen MSDN Beispielen immer lösen. Nur diesmal drehe ich mich eben im Kreis und finde keinen Anfang.

F
10.010 Beiträge seit 2004
vor 15 Jahren

Du meinst, das Du nach Studium von 1200 Seiten C# und ein bischen Forum lesen
verstanden hast, wie SW Architektur funktioniert?

Du kennst die Grundlagen von DI/IOC Container?
Weisst was Generics und Lambdas sind, und
wie man Lambdas Compiliert, bzw ExpressionTrees daraus erstellt?
Du kennst dich mit Refelction, Dynamischer Codeerzeugung und AppDomains aus, und weisst mit Proxies umzugehen?

Nun, dann solltest Du einen DI/IOC auch in ner Stunde schreiben können.
Ansonsten musst Du da evtl mal ein bischen Zeit investieren diese Themen
zu recherchieren.

Die echt guten und brauchbaren DI/IOC die es derzeit gibt, sind von echten Cracks geschrieben und die haben da teilweise Monate für gebraucht, und dann auch meist erst
im 2-3. Ansatz etwas vernünftiges hinbekommen.

Schau dir mal den Auwand an, den soetwas bedeutet:
http://www.codeproject.com/KB/cs/LinFu_IOC.aspx
http://www.codeproject.com/KB/cs/LinFu_IOC_Part2.aspx
http://www.codeplex.com/unity
http://code.google.com/p/autofac/
http://ninject.org/
http://structuremap.sourceforge.net/Default.htm
Und das sind nur die kleineren.

2.760 Beiträge seit 2006
vor 15 Jahren

Warum sollte das umsetzen von MVP in WindowsForms schwieriger sein, als in Web?

Vielleicht nicht grundsätzlich schwieriger allerdings gibt es in diesem Bereich schon viele etablierte Frameworks und die GUI ist mit Templates auch schön einfach zu entkoppeln. Eventuell ist die Sichtbarkeit von MVP-Lösungen im Web auch einfach größer.

F
10.010 Beiträge seit 2004
vor 15 Jahren

Das problem ist da wohl eher, das man bei ASP.NET ja ohnehin schon die Aufteilung
in ASP und Codebehind hat, und deshalb schon gezwungen ist, etwas besser
aufzuteilen.

Unter WPF ist der Anteil der Entwickler die sich z.b. mit MVVP beschäftigen deutlich grösser.

Es gibt auch für WindowsForms und WPF solche Frameworks, nur sind die meisten
Windowsentwickler im gegensatz zu EnterpriseEntwicklern meist garnicht
daran interessiert solche Techniken einzusetzen, weshalb sich das Thema als
solches auch nur ganz langsam durchsetzt.

Man sieht es schon an der Anzahl der Fragen z.b. zu globalen Variablen und Singletons,
gegenüber fragen zu IOC/DI, die soetwas deutlich leichter implementieren lassen.

Oder der Frage wie man auf TextBoxen einer anderen Form zugreift, gegenüber
der Frage, ob man eher PassivView einsetzt oder nicht.

Stipo Themenstarter:in
699 Beiträge seit 2007
vor 15 Jahren

Hallo FZelle und Jaensen,

ich habe mir nun den Unity DI/IOC angesehen und implementiert.
Der Funktioniert sehr gut und ist auch nicht besonders schwer zu verstehen.
Es gibt ja auch schon einige Beispiele dazu hier im Forum, was man zurate ziehen kann.

@FZelle,
ich hatte nie in irgendwelcher weiße gesagt, das ich schon alles verstehen würde, denn dann würde (müsste) ich ja wohl nicht hier nachfragen, wenn ich etwas nicht verstehe 😉
Nur wenn man sich so den Webcast von Ralph Westphal ansieht, dann scheint so ein Microkernel nicht schwer zu sein. Gut ich lasse mich da auch immer gerne eines besseren belehren, aber eine nette herausforderung wäre es sicher gewesen das selber zu entwickeln.
Ich habe aber ein Buch gefunden, was im April heraus kommen soll, wie man einen Microkernel entwickelt, denn das Thema "Dahinter sehen und verstehen was er macht" ist immer noch aktuell 😉

Grüße Stephan

PS: Ich strebe immer an, mich von den Fricklern abzuheben, denn solche Anwendungen gibt es schon genügend.

1.274 Beiträge seit 2005
vor 14 Jahren

@all:

Ich kann allen beipflichten, es erfordert mehr um einen Microkernel zu entwickeln. Hab mir den Webcast von Frank Westphal auch angesehen.
Man muss bedenken, der Mann kennt sich ja aus was SW-Architektur angeht. Und sein Beispiel baut nur mehr oder weniger einen Assembly Loader auf einem Interface. Also nur eine rudimentärste Version.

@Stipo:
Mich würde interessieren welches Buch du zu den Thema gefunden hast?

"Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung." Albert Einstein

D
5 Beiträge seit 2006
vor 14 Jahren

kann mir jemand den Link zu dem Webcast von Frank Westphal nennen? Aus irgendwelchen mysteriösen Gründen kann ich ihn nicht finden

danke und lg
Dodga

Stipo Themenstarter:in
699 Beiträge seit 2007
vor 14 Jahren

"Ralf Westphal" Damit findet Webcast Finder das sicher besser 😉

Microkernel-Architektur - Angewandtes Contract First Design

Grüße Stephan

2.187 Beiträge seit 2005
vor 14 Jahren

Hallo,

Wollte mir auch mal den Webcast ansehen aber es läd bei mir beim besten willen nicht runter! Gibt's da irgend eine andere Quelle wo man es laden kann?

Gruß
Juy Juka