Laden...

Additional.NET

Letzter Beitrag vor 13 Jahren 10 Posts 8.760 Views
Additional.NET

Hallo,

bereits seit längeren arbeite ich an einem Framework, welches auf dem .NET-Framework aufbaut, und dieses für die Anwendungsentwicklung um noch fehlende Funktionalitäten zu erweitert.

Das Framework soll letztendlich unter der LGPL-Lizenz stehen, d.h. im Quellcode frei verfügbar sein und in kommerziellen Produkten eingesetzt werden können.

Nachdem ich nun in Basis-Namespace-Name gesucht einen passenden Namespace gefunden habe, möchte ich darauf aufbauend die Struktur etwas näher erläutern.

Dieser Thread soll dabei der Diskussion bzgl. der verschiedenen Aspekte des Projekts dienen, parallel dazu plane ich einen Beitrag im Artikel-Forum, welcher die Verwendung des Frameworks beschreiben soll. Sobald ich die erste Version des Artikels fertig habe, werde ich ihn hier verlinken (und umgekehrt natürlich).

Zunächst einmal die geplanten Haupt-Namespaces:*TD.Additional: Basis-Namespace, enthält nur sehr häufig benutzte und nicht einzuordnende Klassen *TD.Additional.Configuration: Enthält Klassen zur Verwaltung von Programm-Einstellungen *TD.Additional.Data: Vereinfacht den Zugriff auf Daten (Datenbanken, Dateien, ...) *TD.Additional.Net: Vereinfacht die Übertragung von Daten *TD.Additional.UI: Unterstützt die Ausgabe und Darstellung von Informationen (sowohl Bildschirm als auch Drucker)

Die Verwendung der jeweiligen Hauptfunktionen soll darauf ausgelegt werden, verschiedenste Systeme unterstützen zu können. Idealerweise sollen die Klassen dabei auch in IoC-Containern verwendet werden können, so dass man z.B. ohne (große) Programmänderungen auf andere Datenbanken, andere Datenübertragungsprotokolle oder andere UI-Systeme umsteigen kann, indem der Benutzer einfach per Auswahl (z.B. in den Einstellungen) aus entsprechenden Modulen das gewünschte auswählt.

Der Basis-Namespace TD.Additional soll wie folgt unterteilt werden:*TD.Additional.ComponentModel: Erweitert das .NET-Model um Attribute sowie Klassen für Objekte mit dynamischen Eigenschaften *TD.Additional.Environment: Abfrage von Informationen zur Laufzeit-Umgebung (z.B. Kommandozeilen-Parameter) *TD.Additional.IO: Zusätzliche Funktionen für den Zugriff auf das Dateisystem *TD.Additional.Log: Unterstützung zur Protokollierung *TD.Additional.Runtime: Abfrage von Laufzeit-Informationen, u.a. ein Instance-Manager zur Umsetzung eines Singleton-Pattern für Applikationen *TD.Additional.Xml: Xml-Unterstützung (z.B. (De-)Serialisierung komplexer Objektstrukturen)

Ursprünglich hatte ich auch geplant, einen einfachen IoC-Container mit AddIn-Funktionalität zu integrieren, davon bin ich aber erstmal wieder abgerückt, da ich noch nicht weis, wie ich diesen möglichst generisch einbinden kann. Andererseits halte ich einen solchen für essentiell wichtig, um die vom Framework angebotene Dynamik auch entsprechend in eigenen Anwendungen implementieren zu können.

Der Namespace TD.Additional.Configuration ist noch in Planung. Mit dessen Hilfe soll die Verwaltung von Programm-Einstellungen erleichtert werden, sowohl über das .NET-Konfigurationsmodell als auch eigene XML-Dateien, Datenbanken oder Netzwerk-Dienste.

Die Komponenten im Namespace TD.Additional.Data ermöglichen den einheitlichen Zugriff auf verschiedenste Datenquellen. D.h. primär werden die Datenbanken von MS, Oracle und MySql unterstützt, aber auch lesender und ggf. schreibender Zugriff auf Excel-, Access-, dBase-, HTML sowie CSV/TXT-Dateien ist möglich. Ggf. soll auch die Erstellung von Berichtsdateien ermöglicht werden, um das ganze Gehampel mit dem DataSet-Designer zu umgehen.

Parallel dazu soll der Namespace TD.Additional.Net Funktionalitäten zur Verfügung stellen, um Daten mit einer einheitlichen Schnittstelle zu übertragen, unabhängig vom verwendeten Protokoll (TCP, FTP, ISDN).

Im Namespace TD.Additional.UI befinden sich schließlich Klassen und Interfaces zur Unterstützung der Ausgabe und Darstellung von Informationen auf unterschiedlichen Plattformen (primär Windows-Forms und WPF). Die Namespace-Struktur wird dadurch ungefähr so aussehen:*TD.Additional.UI: UI-Basis-Namespace *TD.Additional.UI.Printing: Interfaces und grundlegende Klasse zur Abstrahierung von den Drucker-Schnittstellen *TD.Additional.UI.PropertyEditor: Interfaces und grundlegende Klassen für den PropertyEditor *TD.Additional.UI.WinForms: WinForms-Basis-Namespace *TD.Additional.UI.WinForms.Printing: Unterstützung des Ausdrucks auf Graphics-Basis *TD.Additional.UI.WinForms.PropertyEditor: WinForms-PropertyEditor *TD.Additional.UI.WPF: WPF-Basis-Namespace *TD.Additional.UI.WPF.Printing: Unterstützung des Ausdrucks auf XPS-Basis *TD.Additional.UI.WPF.PropertyEditor: WPF-PropertyEditor

Geplant ist zudem eine UML-Komponente, um beliebige Objekt-Strukturen darstellen zu können (Klassendiagramme, einfache Workflows, Datenbank-Strukturen, ...), dass Andocken von Fenstern an andere Fenster sowie ein einheitliches System zur Anwender-Benachrichtigung (MessageBox, Tray-Notification, ...).

Bzgl. Naming Guidelines werde ich demnächst einen kleinen Leitfaden posten, zudem versuche ich, die Anmerkungen von FxCop umzusetzen. Des weiteren wollte ich mich mal mit Clean Code Development und Unit-Tests auseinandersetzen, um den Code weiter zu verbessern.

Einige Methoden oder Klassen hätte man sicher auch als Extensions schreiben können, aber zumindest die Basis-Funktionalität sollte auch unter .NET 2.0 einsetzbar sein.

Im Anhang die erste Version der Basis-Assembly TD.Additional.dll im Quellcode. Die Test-Anwendung ist allerdings äusserst rudimentär.
Zu den wichtigsten Klassen im Detail:*TD.Additional.DateExtensions: Zusätzliche Datums-Funktionen (Osterdatum, Kalenderwoche) *TD.Additional.Debug: Unterstützung beim Debuggen durch Console-Output und Logging *TD.Additional.EnumHelper: Bietet Unterstützung bei der Arbeit mit Enumerationen *TD.Additional.EventArgs: Generische EventArgs-Klasse *TD.Additional.TaggedString: Text mit optionalem Objekt, hilfreich z.B. für ListBox, ComboBox *TD.Additional.ComponentModel.DataErrorInfo: IDataErrorInfo-Implementierung *TD.Additional.ComponentModel.NotifyPropertyChanged: INotifyPropertyChanged-Implementierung *TD.Additional.ComponentModel.*Attribute: Attributklassen zur Unterstützung für den PropertyEditor (TD.Additional.UI) *TD.Additional.Environment.CommandLineParser: Kommandozeilen-Parser, siehe Beispiel in TestApp *TD.Additional.IO.Directory: Verzeichnisse kopieren / verschieben *TD.Additional.IO.File: Lese-/Schreibzugriff prüfen, Dateivergleich *TD.Additional.Log.ILog: Protokollierungsschnittstelle *TD.Additional.Log.Log: Basis-Implementierung für Protokoll-Klassen *TD.Additional.Log.CombinedLog: Kombiniert mehrere Protokollklassen *TD.Additional.Log.ConsoleLog: Ausgabe auf der Console *TD.Additional.Log.EventLog: Protokollierung in Windows-Ereignisanzeige *TD.Additional.Log.FileLog: Protokollierung in Datei (Option zur Erweiterung z.B. für HTML, XML, ...) *TD.Additional.Log.MemoryLog: Speicherung aller Protokolleinträge im Speicher *TD.Additional.Log.NotifyLog: Eventunterstützende Protokollierung, z.B. für Just-In-Time-Überwachung in UI *TD.Additional.Runtime.InstanceManager: Instance-Manager zur Kommunikation zwischen mehreren Anwendungsinstanzen, siehe Beispiel in TestApp *TD.Additional.Xml.Xml: (De-)Serialisierung komplexer Objektstrukturen, Unterstützung bei der Abfrage und Einstellung von Xml-Dokumentdaten

Der Code sollte einigermaßen aufgeräumt sein (bis auf die TestApp), nur FxCop meckert noch gewaltig.

Wer Fehler findet bzw. Ideen, Anmerkungen oder Fragen hat, einfach hier melden. Wer aktiv mitarbeiten möchte, soll mir bitte eine PM schicken, damit ich eine Liste erstellen kann, welche ich später bei Einrichtung des SVN-Repositories berücksichtige, vermutlich werde ich das Projekt auf CodePlex hosten (muss ich demnächst mal austesten).

Nobody is perfect. I'm sad, i'm not nobody 🙁

Hallo!

Dass Projekt sollte demnächst auch auf CodePlex verfügbar sein: Additional.Net, dort befindet sich dann auch das SVN-Repository.

Nobody is perfect. I'm sad, i'm not nobody 🙁

ich finde, wenn du es auf codeplex postest, solltest du die Beschreibung schon auf englisch schreiben.

Ansonsten bin ich sehr gespannt auf das Projekt 😉

Träume nicht dein Leben sondern lebe deinen Traum.
Viele Grüße, David Teck

Hallo

Ich habe mir ein paar Klassen angesehen. Auf das Beispiel zu dem Konsolen-Args-Parser freue ich mich schon und die Log-Klasse sieht auch sehr praktisch aus.

Was mir aber aufgefallen ist: Warum verwendest du z.B. für die Hash-Funktion des Strings keine Extension-Methoden? Das wäre für mich natürlicher wenn die jeweilige Variable schon ihren Hash liefern kann und ich nicht auf String.GetHashBlabla ausweichen muss.

As a man thinketh in his heart, so he is.

  • Jun Fan
    Es gibt nichts Gutes, außer man tut es.
  • Erich Kästner
    Krawutzi-Kaputzi
  • Kasperl

Hallo!
@der-schlingel:

Einige Methoden oder Klassen hätte man sicher auch als Extensions schreiben können, aber zumindest die Basis-Funktionalität sollte auch unter .NET 2.0 einsetzbar sein. 😉

Bzgl. Konsolen-Args-Parser: Da versuch' ich mal zeitnah, eine kleine Beschreibung zu schreiben.

@TripleX:
Hast recht, hatte aber einfach keine Lust, das jetzt noch zu übersetzen, hab' den text zum größten Teil nur schnell aus dem ersten Post hier kopiert.

Nobody is perfect. I'm sad, i'm not nobody 🙁

Dass Projekt sollte demnächst auch auf CodePlex verfügbar sein:
>
, dort befindet sich dann auch das SVN-Repository.

Hi, ich bin eben erst auf das Projekt aufmerksam geworden - das letzte Update auf Codeplex war im April 2010.... Arbeitest Du noch an diesem Projekt und denkst an Uplaods an Codeplex?!? Oder isses dead?

bye,
Michael

Debuggers don't remove Bugs, they only show them in Slow-Motion.

Hallo!

Das Projekt lebt noch (u.a. der Database-Explorer baut darauf auf).
CodePlex benutze ich aktuell erstmal nicht mehr, da hatte ich ziemliche Verbindungsprobleme (Abbrüche, langsam).
Hatte mir bisher auch keine Gedanken über andere Möglichkeiten gemacht, ich schau mal, dass ich was zusammenstelle.

Nobody is perfect. I'm sad, i'm not nobody 🙁

Hatte mir bisher auch keine Gedanken über andere Möglichkeiten gemacht, ich schau mal, dass ich was zusammenstelle.

Also ich fänds schön, wenn das Projekt irgendwo public wäre....

Bye,
Knick

Debuggers don't remove Bugs, they only show them in Slow-Motion.

Hallo!

Meine Hauptsorge z.Zt. ist, dass ich eine Version online stelle, wo ich dann nach kurzer Zeit in größerem Umfang Schnittstellen anpassen muss (hatte ich in meinem Weihnachtsurlaub, wo ich den Database-Explorer begonnen hatte).

Da ich aber mittlerweile die meisten Interfaces (zumindest meiner Meinung nach) halbwegs zukunftssicher habe, wage ich mal die Behauptung, bis Ende des Monats eine Veröffentlichung ermöglichen zu können.

Sobald dies der Fall ist, werde ich es hier selbstverständlich vermelden 😉

Nobody is perfect. I'm sad, i'm not nobody 🙁

Also das ganze klingt sehr interessant, du könntest als Alternative dein Projekt auf z.B. github stellen einstellen und später vielleicht bei NuGet als Paket : http://nuget.org/