| 

.NET C# Java Javascript Exception

8
Hallo,

mich würde interessieren, wie Ihr Eure Software strickt, um Sie an unterschiedliche Kundenanforderungen anpassen zu können? Hintergrund ist folgender: Wir haben ein Softwareprodukt entwickelt, dass aus CAD/CAM-Systemen Daten (z.B. Stücklisten) in unterschiedlichsten Formaten exportiert oder auch div. Daten aus Drittsoftware in das CAD/CAM importiert. Also man kann sagen eine Art Schnittstellensoftware. Die Software baut auf dem .NET-Framework 4.0 auf, Programmiersprache VB.

Nun haben wir immer wieder Kunden, die sehr individuelle Anforderungen an diese Schnittstelle haben. Da wir diese Anforderungen auch umsetzen wollen ohne dabei die Software zu stark aufzublähen haben wir schon verschiedene Methoden ausprobiert, um die Schnittstellen zu individualisieren.

Methode 1: Microsoft Scripting Control. Indivdiuelle Einstellungen werden direkt beim Kunden in einem Visual Basic Script vorgenommen, an welches wir Objekte übergeben. Das Microsoft Scripting Control interpretiert das Script zur Laufzeit. Das Klappt auch sehr gut. Nachteil: Wenn sich herausstellt, dass in einem ausgelieferten Script etwas geändtert werden muss, können wir nicht einfach mittels Update seine Scriptdateien updaten, da diese ja individuell angepasst wurden.

Methode 2: Einsatz eines professionellen Formeleditors. Wenn es darum geht einfach nur Werte innerhalb eines Exports zu individualisieren, kann man ganze Ausdrücke als Formel hinterlegen und ein ExpressionEvaluator gibt anschließend zur Laufzeit den zu exportierenden Text, die Zahl etc. zurück. Derzeit setzen wir List & Label von combit in der Enterprise Edition ein, womit wir auch sehr zufrieden sind! Nachteil: Ist lediglich für einzelnen Ausdrücke geeignet. Wenn man allerdings einen komplett individuellen Export oder Import programmieren muss funktioniert das leider nicht.

Eine weitere Idee: Wir programmieren für individuelle Anforderungen eine eigene dll, die wir zur Laufzeit einbinden. Haben wir bisher so noch nicht umgesetzt. Wenn das jemand so macht würde mich interessieren wie genau er dabei vorgeht.

Mich würde interessieren, wie Ihr das macht? Hat vielleicht jemand DIE SUPERLÖSUNG, die er mir/uns mitteilen möchte? An VSTA haben wir auch schon gedacht, leider ist die Komponente sehr teuer und hinkt den aktuellen Versionen des .NET Frameworks immer hinterher. Ob es derzeit überhaupt noch weiterentwickelt wird weiß ich ehrlich gesagt gar nicht.

Freue mich auf Eure Antworten!
Gruß, Daniel
News:
21.03.2013
Dan 51 2
3 Antworten
1
Die besten Erfahrungen haben wir mit Fabriken gemacht. Man definiert eine Schnittstelle, die alle Erweiterungen über die Fabrik ausführen können sollen. Kundenindividuelle Anpassungen werden dann einfach als Implementierungen bereitgestellt.
Meist gibt es nur wenige zentrale Stellen, wo dies erforderlich ist. Wird dann noch eine Defaultimplementierung angeboten, die immer dann ausgeführt wird, wenn keine Erweiterung registriert ist, sollte das Ganze "rund" laufen.
21.03.2013
edvservice 1,4k 1 6
1
Ihr habt euch da schon ganz gut gedanken zu dem Thema gemacht. Theoretisch wäre Dependency Injection genau das was ihr brauchen könntet. Also das was du als "Methode 3" beschrieben hast. Euer Programm bietet entsprechende Einstiegspunkte (Interfaces) und die Implementierung der Interfaces findet das Programm dann in der kundenspezifischen DLL.
21.03.2013
Floyd 14,6k 3 9
0
`n Abend,

danke für Eure Antworten. Ich bin Methode 3 nun mal angegangen. Ich lade nun über die Assembly-Klasse die kundenspezifische DLL. Dort erwarte ich dann eine bestimmte Klasse, die ich mit Assembly.CreateInstance instanziiere. Dort prüfe ich dann, ob das Objekt ein Interface, das ich über das aufrufende Proggramm bereitstelle, implementiert. So in der Art sieht's nun aus:

Dim ass As Assembly = Assembly.LoadFile(CustomAssemblyFilePath)
If ass Is Nothing Then Return Nothing

Dim o As Object
o = ass.CreateInstance("Materialimport")
If o Is Nothing Then
Return Nothing
Else
If TypeOf o Is IMaterialimport Then
Return o
Else
Return Nothing
End If
End If
End Get


Diesen Code habe ich nun in eine readonly property gepackt und gebe je nachdem ob die aufgerufene Klasse das Interface Implementiert oder nicht die Klasse zurück oder nicht.

Funktioniert wirklich gut!
21.03.2013
Dan 51 2
1
Warum nutzt Du keinene IoC-Container? Unity, Autofac etc. Dies erlaubt Dir auch eine unkomplizierte Konfiguration per XML.
lbm1305 22.03.2013
Manchmal ist es 'oversized' einen IoC Container einzusetzen. Vor allem in GUI Bereich. Ein Plugin System hat den Charme, alle DLL's in ein Verzeichnis zu packen und bei Programmstart dieses Verzeichnis zu scannen.
Es hat aber auch den Nachteil, das man (nur schwer/gar nicht) diese Plugins aus der aktuellen AppDomain entladen und neu zu laden kann.
Siehe hierzu auch: http://adrianvintu.com/blogengine/post/Unloadable-plugins.aspx
Karl 22.03.2013
Sicherlich kommt es auf die Größe des Projektes an.
Aber auch ein IoC-Container kann alle DLL's beim Start einlesen, registrieren und alle benötigten Abhängigkeiten auflösen.
lbm1305 22.03.2013
Ich will IoC auch nicht per se schlecht reden :) Wie schon gesagt, ein Plugin System kann auch Nachteile haben.
Karl 22.03.2013
Hab ich auch nicht gedacht ;-)
lbm1305 22.03.2013

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH