Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   .NET-Framework (managed code) (https://www.delphipraxis.net/79-net-framework-managed-code/)
-   -   C# Womit höchstmodulare WPF-Anwendungen erstellen? (https://www.delphipraxis.net/159259-womit-hoechstmodulare-wpf-anwendungen-erstellen.html)

Mithrandir 20. Mär 2011 18:40

Womit höchstmodulare WPF-Anwendungen erstellen?
 
Hi ihr,

Frage steht eigentlich schon im Titel - womit geht das am Besten? Ziel ist eigentlich, dass ich eine Basisanwendung erstelle, und anschließend alles über Zusatzplugins gelöst wird, die auch nach belieben hinzugefügt oder weggelassen werden können. Das Kernprogramm übernimmt nur die Steuerung der Kommunikation der einzelnen Elemente und verwaltet die Module.

Womit könnte ich sowas in CSharp + WPF umsetzen?

KrasserChecker 20. Mär 2011 19:32

AW: Womit höchstmodulare WPF-Anwendungen erstellen?
 
Na da fallen mir spontan gleich 2 Kürzel ein, mit denen sich das Problem einfachst lösen läßt:
WAF und MEF

Die Lernkurve ist nicht ganz klein, aber es lassen sich damit dann wirklich einfach Anwendungen erstellen, die über Plugins erweitert werden können. Zumindest MEF nutzt Microsoft selbst, um ihr Visual Studio 2010 mit Addins erweiterbar zu machen.

Ich nutze beides seit einiger Zeit zusammen und bin echt begeistert.

Phoenix 20. Mär 2011 20:06

AW: Womit höchstmodulare WPF-Anwendungen erstellen?
 
Ein Plugin-System ist in .NET mittels ein paar Zeilen zu machen.
Man braucht lediglich ein Interface, welches das Plugin implementieren muss. Mittels Reflection kann man dann alle alle Assemblies mit den Plugins (z.B. aus einem bestimmten Verzeichnis) laden, dort nach Klassen suchen die dieses Interface implementieren, diese instanzieren und that's it.

Das finden der entsprechenden Klassen ist mit LINQ ein Einzeiler: Assembly.GetTypes().Where(t => t.IsSubclassOf(typeof(YourInterface)))

Mithrandir 21. Mär 2011 07:20

AW: Womit höchstmodulare WPF-Anwendungen erstellen?
 
Danke euch beiden...

@Phoenix: SO einfach? :gruebel: Und mit dieser Methode kann ich auch dynamisch Assemblies laden? Ich bin mir noch nicht ganz sicher, wie ich das genau umsetze. Eigentlich möchte ich dem User die Möglichkeit geben, für eine Aktion zwischen mehreren Modulen wählen zu können und ggf. ein Standardmodul zu definieren. Ähnlich wie Android, welches ja auch komplett modular aufgebaut ist.

Phoenix 21. Mär 2011 07:39

AW: Womit höchstmodulare WPF-Anwendungen erstellen?
 
Naja, ein paar Zeilen mehr sinds schon.

Erstmal alle Files die mit .dll enden laden:

Code:
foreach (var file in Directory.GetFiles(AppDomain.CurrentDomain.RelativeSearchPath, "*.dll"))
{
   try
   {
      Assembly.LoadFrom(file);
   }
   catch { } // fine here. Existing .dll could be a native library
}
Nun hast Du alle Assemblies verfügbar und kannst daraus alle Typen ermitteln, die Du benötigst. Dazu gibts ne kleine Helfermethode:

Code:
private static List<Type> FindTypes<T>()
{
  return AppDomain.CurrentDomain.GetAssemblies()
    .Select(a => a.GetTypes())
        .SelectMany(a =>
          a.Where(t => t.IsClass && !t.IsAbstract && typeof(T).IsAssignableFrom(t)))    
    .ToList();
}
Sagen wir Du hast ein Interface namens IMyPlugin und das definiert ne Methode Load() dem Du Deinen Plugin-Host übergibtst, dann initialisierst Du alle Plugins so:

Code:
foreach (var pluginType in FindTypes<IMyPlugin>())
{
    IMyPlugin instance = (IMyInterface) Activator.CreateInstance(pluginType);
    instance.Load(this); // oder whatever halt  
}
In load können die sich dann in ne List<IMyPlugin> auf dem Host legen oder Du merkst Sie Dir irgendwie anders.

Wenn Du nicht gleich alle instanzieren willst kannst Du natürlich auch einfach die Typen aus der Liste anzeigen und nur einzelne instanzieren. Mittels Custom Attributen kannst Du auch noch weitere Informationen zu den Plugins ausgeben etc. .NET ist da ziemlich mächtig *g*

Mithrandir 21. Mär 2011 14:05

AW: Womit höchstmodulare WPF-Anwendungen erstellen?
 
Hm... Ich bin grad über Prism gestolpert - klingt eigentlich auch interessant... :gruebel:

//Edit: Ach... Danke fürs Beispiel... :)

Stevie 25. Mär 2011 00:08

AW: Womit höchstmodulare WPF-Anwendungen erstellen?
 
Was mir in dem Zusammenhang noch einfällt, wäre Caliburn Micro.

mquadrat 25. Mär 2011 13:57

AW: Womit höchstmodulare WPF-Anwendungen erstellen?
 
Also mein erster Tipp wäre auch Prism gewesen. Der zweite Caliburn.Micro mit MEF. 8-)

Mithrandir 28. Mär 2011 20:14

AW: Womit höchstmodulare WPF-Anwendungen erstellen?
 
Danke euch - auch wenn ich noch ein wenig Schlucke, was die Lernkurve von Prism angeht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:34 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz