Laden...

Indiv.Anwendung für mehrere Kunden

Erstellt von Kostas vor 18 Jahren Letzter Beitrag vor 18 Jahren 3.659 Views
K
Kostas Themenstarter:in
597 Beiträge seit 2005
vor 18 Jahren
Indiv.Anwendung für mehrere Kunden

Hallo Zusammen,

ich habe eine Anwendung entwickelt welche gewisse
Stammfunktionalität bietet. Es gib Kunden die möchte
bestimmte Funktionalität dazu haben, und manche sogar
Stammfunktionalität angepasst haben.
Weil es noch am Anfang ist, ist es kein Problem für jeden
Kunden die sources in ein neues Verzeichnis zu kopieren
und dort die entsprechenden Änderungen durchzuführen.

Wenn das Projekt jedoch noch weiteren Absatz finden sollte,
wird es schwierig. Die Stammfunktionalität sollte ja weiterentwickelt
werden. Dazu fehlt mir nur bedingte Kompilierung ein. Ist das der
einzige weg das Problem zu meistern, oder gibt es professionellere
Ansätze.

Gruß Kostas

1.271 Beiträge seit 2005
vor 18 Jahren

Ich würde dir raten mit AddIns zu arbeiten. Les dir dazu am besten mal Building Applications with the SharpDevelop Core durch. Da lernst du, wie SharpDevelop aufgebaut ist und vorallem, wie du das in deine eigenen Anwendungen einbaust. Die Stammfunktionalität (bei dem Bsp. 'Base' genannt) ist immer gleich. Wenn diese angepasst werden muss, kommst du aber wohl nicht darum herum den Sourcecode zu ändern.

A wise man can learn more from a foolish question than a fool can learn from a wise answer!
Bruce Lee

Populanten von Domizilen mit fragiler, transparenter Außenstruktur sollten sich von der Translation von gegen Deformierung resistenter Materie distanzieren!
Wer im Glashaus sitzt, sollte nicht mit Steinen werfen.

3.728 Beiträge seit 2005
vor 18 Jahren
Plattform

Hallo Kostas,

bau eine Plattform anstatt ein fertiges Programm. Anstatt alles festzuschreiben und einen statisches Datenbankmodell zu verwenden, schreibst Du eine erweiterbare Umgebung die ohne Neukompilierung erweitert werden kann (Das geht hervorragend mit einem Microkernel-Ansatz). Die Datenbank muss auch erweiterbar sein. Zwar kann man einfach neue Felder in eine Tabelle einfügen, das ist aber meistens nicht ausreichend. Spätestes in der Benutzeroberfläche stellt sich dann die Frage: Mit welchem Label (Sprechender Name) wird das Feld dargestellt und wie wird es formatiert, in welchen Listen taucht es auf und in welchen nicht ...

Die Lösung ist eine Metadatenschicht vor der Datenbank. Dort werden all diese Zusatzinformationen zu Datenbankfelder, Tabellen und Tabellenbeziehungen hinterlegt. Solche Metadatenschichten werden oft mit XML entworfen, weil sich das sehr gut mit Webservices (die kommunizieren ja mittels SOAP in XML) verbinden lässt. Stell am besten die Geschäftslogik statuslos auf einen Server und mach die Funktionen über Webservices für Clients zugänglich. Dann bist Du auch sehr frei, was die Clients angeht. Der eine Kunde möchte einen Webclient, der andere eine Forms-Anwendung und der nächste vielleicht eine Java-Anwendung.

Bei kundenspezifischen Masken hilft Dir Vererbung. Du erstellst z.B. ein Stammformular mit den Grundfunktionen. Von dem lässt Du spezielle kundenspezifische Formulare erben. Du erzeugst Deine Formulare dann nicht mit "new" (also wie normal üblich), sondern über eine Factory. Die Factory kann vor dem erzeugen des Formularobjekts in z.B. einer XML-Konfigurationsdatei nachschauen, welches Formular aus welcher Assembly geladen wird (Da alle vom Stammformular erben, kann sich Deine Infrastruktur darauf verlassen, dass bestimmte Funktionen vorhanden sind).

Wenn die Geschäftslogik sauber auf einem Server in Webservices gekapselt ist, sind Erweiterungen ein Kinderspiel. Für ein neues Kundenfeature einfach einen neuen Webservice schreiben, der mit den bestehenden kommuniziert. Oft greifen neue Features aber so tief, dass sie eigentlich in der verarbeitung der Stammlogik aufgerufen weden sollten (z.B. bei einer nachträglichen Integration einer Stücklistenverwaltung in ein Lagerbuchungssystem). Das lässt sich erreichen in dem man grundsätzlich bestimmte Stellen zur nachträglichen erweiterung einbaut. Das könnte z.B. Andockpunkte vor und nach einem Prozessschritt sein. Enterprise Services (COM+) stellt bereits eine Lösung für dieses Problem zur Verfügung: LCE = Loosely Coupled Events (Deutsch: Lose gekoppelte Ereignisse).

Um kleine Erweiterungen schnell umsetzen zu können, solltest Du Deine Plattform "Script-fähig" machen. Dazu kannst Du z.B. VBScript/JScript verwenden (Strichwort Microsoft Script Control) oder natürlich .NET Sprachen. So können sehr schnell kleine Kundenwünsche "Vor-Ort" mal schnell "eingeflickt" werden. Den Kunden freuts, wenn es schnell geht. Man sollte es mit dem Skripten aber nicht übertreiben.

Wenn man einmal so eine Plattform hat, sind Erweiterungen in kürzester Zeit realisierbar. Die investierte Zeit lohnt sich. Sieh Dir SAP an. Eine erweiterbare, skalierbare Plattform für Geschäftsanwendungen.

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Kostas,

also im einfachsten Fall machst du alle Methoden der eigenen Basisklassen virtual und dann kann man durch Verwendung von Unterklassen jedes beliebige Verhalten ändern (override). Du musst dann nur noch dafür sorgen, dass für den jeweiligen Kunden die Objekte der entsprechenden Kundenklasse erzeugt werden. Dafür gibt es verschiedene Ansätze. Im einfachsten Fall gibt es in den Basisklassen virtuelle Methoden zum Erzeugen, die man in den Unterklassen entsprechend überschreibt.

herbivore

K
Kostas Themenstarter:in
597 Beiträge seit 2005
vor 18 Jahren

puh, das ist ganz schön heftig. Da bin ich noch Lichtjahre davon entfern.
Das Projekt wovon ich sprach, habe ich in Delphi geschrieben.
Ich sehe schon, C# ist eine ganz andere Liga. Ich werde viel Zeit investieren
um es zu lernen.

Dankeschön für die Antworten. Das schreckt mich jetzt nicht ab, sondern
ganz im Gegenteil. Das bestätigt meinen Schritt den radikalen Umstieg
in C#.
Aktuell versuche ich die Eckpfeiler zu bestimmen auf die ich mich dan
gezielt konzentrieren werde. Diese sind: VS2005, SQL-Server 2005 und
Firebird je nach Projekt und NDO OR-Mapper. Was noch offen ist,
ein flexibler Reporter. Am liebsten code based in C#.

Herzlichen Dank nochmals.
Gruß Kostas

3.728 Beiträge seit 2005
vor 18 Jahren
Reporting

Schau Dir mal die SQL Server Reporting Services vom Microsoft an. Die sind automatisch Bestandteil der SQL Server Standard oder Enterprise Lizenz (Zumindest beim SQL Server 2000). Damit hast Du einen programmierbaren Report-Server. Reports können lokal in Programme eingebunden und Visual Studio designt werden (Auch mit den Express Versionen). Der Server stellt außerdem eine sehr gute Weboberfläche zur verfügung, wo Benutzer Berichte ablegen, abonnieren und natürlich ausführen können. Es sind auch interaktive Berichte (Drill-Down) im Internet Explorer möglich. Für die Ausgabe ist auch gesorgt, die Reporting Services können Berichte standardmäßig in folgenden Formaten ausgeben:

-PDF
-TIFF (Mehrseitig)
-HTML
-HTML mit interaktiven Elementen
-CSV
-Excel

Falls das nicht genügt, können eigene Rendering-Erweiterungen in C# geschrieben werden.

Hier gibts weitere Infos:

http://www.microsoft.com/germany/sql/2000/technologien/reportingservices/default.mspx

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Kostas,

was mir noch eingefallen ist. Man kann auch schon viel über Events machen. Also der kundenübergreifende Code wirft an allen Ecken und Ende Events und die kundenspezifischen Erweiterungen/Änderungen registrieren EventHandler für die passenden Events.

herbivore

K
Kostas Themenstarter:in
597 Beiträge seit 2005
vor 18 Jahren

Original von Rainbird
Schau Dir mal die SQL Server Reporting Services vom Microsoft an. ...

Hallo Rainbird,
Der SQL Reporting Services steht ganz ober auf meiner Liste.
Für bestimte Projekte kann ich aus Kostengründen
nicht MS SQL-Server verwenden.
Ein db unabhängiger Reporter macht in meinem Fall sicherlich Sinn.

Gruß Kostas

K
Kostas Themenstarter:in
597 Beiträge seit 2005
vor 18 Jahren

Hallo herbivore,

es gibt sicherlich total viele Möglichkeiten das Thema zu behandeln.
Von meiner Anwendung gibt es aktuell vier Kundenversionen.
Ich werde in ein fünftes Projekt alle Versionen zusammenführen
und über Parameter steuern. Wenn die Feld-Labels Kundenabhängig
werden, so werde ich diese in einer eigenen db Tabelle hinterlegen.
Das müsste soweit funktionieren. Allerdings wird mein Code
nicht gerade übersichtlicher.
Das Projekt muss aber solange so auskommen bis ich so weit bin es
komplett neu zu Schreiben in C#.

Gruß Kostas