Fortuna Entwickler Blog

Hier wird Ihnen geholfen

Transfer von DBWEBTESTDMZ1 nach DBWEBTEST3

  1. Erstellen eines Exports auf DBWEBTESTDMZ1
    Über die Eingabeaufforderung auf dem Datenbankserver wird mittels des Kommandos EXPDP (https://oracle-base.com/articles/10g/oracle-data-pump-10g) ein kompletter Datenbankdump erstellt. Hierfür verwendet werden die Batchdatei 'fullexport_dbwebtestdmz1.bat' und dir darin verwiesene 'fullexport_dbwebtestdmz1.dat' (siehe Attachments). bei Anderen Datenbankservern müssen die Namen / Logindaten entsprechend angepasst werden.

  2. Erstellen einer neuen Datenbank auf DBWEBTEST3
    Über die Anwendung 'Datenbank-Konfigurationassistent' wird eine neue Datenbank erstellt:

    Zu beachten ist hier insbesondere der verwendete Zeichensatz. Das abgefragte "dbora"-Kennwort ist das Kennwort des entsprechenden Windows-Benutzers. Wichtig ist auch, den Haken bei 'Als Containerdatenbank erstellen' zu entfernen, da dies Implikationen auf die Lizenzen hätte. Mit Klick auf 'Weiter' wird dann die Datenbank erstellt und steht nach kurzer Zeit zur Verfügung.

  3. Konfigurieren und starten des Listeners
    Der Listener auf dem Server muss einmalig erstellt werden. Dies kann entweder über das Tool 'netca' erfolgen, welches über die Kommandozeite aufgerufen wird, oder man erstellt einfach unter {ORACLE_HOME}/NETWORK/ADMIN (das Verzeichnis, in dem auch tnsnames.ora und sqlnet.ora liegen) eine Textdatei listener.ora (Beispieldatei siehe Attachments). Der Listener muss dann noch einmalig über die Eingabeaufforderung mittels 'lsnrctl start' gestartet werden (https://docs.oracle.com/cd/B16351_01/doc/server.102/b14196/network004.htm).

  4. Notwendige Datenbankobjekte erstellen
    Spezifisch für diesen aktuelle Transfer wurden einige Objekte vorab angelegt.
    Dies ist zum einen der Tablespace. Dieser wurde initial auf 20GB gesetzt und wie in der Entwicklungs- und Produktionsumgebung WEBDATA genannt (anders als auf DBWEBTESTDMZ1; hier hiess er DATA01).
    Desweiteren wird der User GUTSUPER mit DBA-Rechten angelegt. Es werden diverse Rollen erstellt und diesen Rechte erteilt und zuletzt noch Database Links erstellt. Bei Erstellung der Links ist darauf zu achten, daß auch tatsächlich eine Verbindung zum Zielserver hergestellt werden kann. Dies kann man in der Eingabeaufforderung mit 'TNSPING [Servername]' testen. Der Ping muss erfolgreich sein, ansonsten fehlen hier ggf. entsprechende Konfigurationen in Firewall/Proxy.
    Das Vollständige Script 'Neuinstallation Datenbank.txt' ist in den Attachments enthalten.

  5. Import der Daten und Strukturen aus DMWEBTESTDMZ1
    Zuletzt werden dann Strukturen und Daten aus dem Datenbankdump (siehe 1.) mittest IMPDP (https://oracle-base.com/articles/10g/oracle-data-pump-10g) übernommen. Dies geschieht über eine Batchdatei 'Fullimport_DBWEBTEST3.bat' und die darin verwiesene Konfigurationsdatei 'Fullimport_DBWEBTEST3.dat'.
    Im vorliegenden Fall wurden nur die Schemas WEBDATA, WEBFRW, WEBSERVICES übernommen. Dies ist ggf. in der Konfigurationsdatei anzupassen. Die Transformation des Tablespaces (DATA01 zu WEBDATA, siehe 4.) wird in der Konfigurationsdatei berücksichtigt (Dateien siehe Attachments)


Attachments

fullexport_dbwebtestdmz1.bat (82B)


listener.ora (580B)

Neuinstallation Datenbank.txt (1,8KB)

Fullimport_DBWEBTEST3.bat (79B)

Neues Ticketsystem der myLife

Zur Nutzung des Ticketsystems Bedarf es einer einmaligen Anmeldung. Hierzu startet man einen Browser nach Wahl und navigiert zu https://mylife-leben.visualstudio.com/


Hier gibt man die zuvor mitgeteilten Zugangsdaten an. Der Benutzername lautet üblicherweise vorname.nachname@licensemylifeleben.onmicrosoft.com; das Passwort ist individuell. Danach auf 'Anmelden' klicken.


Im nächsten Schritt wird man bei der ersten Anmeldung gebeten, sein Passwort zu ändern. Hier wählt man nun ein persönliches Passwort (welches man sich natürlich merken sollte):


Das Alte Passwort noch einmalig angeben; das neue Passwort angeben und wiederholen und zuletzt auf 'Kennwort ändern und anmelden' klicken.

Hat man alles richtig gemacht, muss man bei der ersten Anmeldung noch eine gültige Email-Adresse angeben; üblicherweise die mylife-leben.de oder honorarkonzept.de Adresse:


Den Haken darunter klickt man üblicherweise nicht an, es sei denn, man möchte zukünftig von Microsoft Marketingmails erhalten.

Damit ist die erste Anmeldung abgeschlossen und man landet auf der Portalseite des Ticketsystems:


Bewegt man die Maus über 'Fortuna' erscheint rechts daneben 'Dashboards'. Klickt man hier drauf, gelangt man zur Übersichtseite für die Tickets:


Diese Seite ist für den späteren Aufruf direkt https://mylife-leben.visualstudio.com/Fortuna/_dashboards aufrufbar. Am Besten speichert man sich im Browser direkt ein Lesezeichen/Bookmark.

Über die Box rechts ('New Work Item') kann man dann neue Tickets erstellen.

Lizenzen in der Softwareentwicklung

Derzeit haben wir eine Reihe von Produkten im Einsatz, für die jeweils einmalige und in der Folge dann jährliche Lizenzkosten Anfallen. Die jährlichen Lizenzkosten gewähren die Möglichkeit zum Update der Software und berechtigen zum eröffnen von Supporttickets, falls man auf einen (vermeintlichen) Fehler stößt.

Telerik KendoUI Complete
http://www.telerik.com/purchase/kendo-ui
4 Lizenzen
$1.149,00 Kaufpreis je Lizenz
€2.300,00 jährliche Lizenzkosten für 4 Lizenzen

Aspose Total.NET
https://www.aspose.com/products/total/net
1 Company Lizenz ("Site Small Business")
$ 14.995,00 Kaufpreis
€ 6.500,00 jährliche Lizenzkosten

EVO HTML to PDF Converter
http://www.evopdf.com/html-to-pdf-converter.aspx
1 Company Lizenz
$ 1.200,00 Kaufpreis
$ 550,00 jährliche Lizenzkosten (derzeit nicht aktiv)

devArt dotConnect for Oracle Professional Edition
https://www.devart.com/dotconnect/oracle/
1 Site Lizenz
$ 1.799,95 Kaufpreis
$ 849,95 jährliche Lizenzkosten

dbForge Studio for Oracle Standard Edition
https://www.devart.com/dbforge/oracle/studio/
2 Lizenzen
$ 159,00 Kaufpreis je Lizenz
$ 59,95 jährliche Lizenzkosten
(derzeit keine laufenden jährlichen Lizenzkosten / verwendete Version veraltet)

ReSharper
(derzeit keine Lizenzen vorhanden)
2 Lizenzen
https://www.jetbrains.com/resharper/
$ 299,00 Kaufpreis
$ 239,00 Lizenzkosten nach einem Jahr
$ 179,00 jährliche Lizenzkosten in den Folgejahren


Administration von Benutzern für myInfoPoint

Zu den täglich anfallenden Aufgaben gehört es, Einstellungen zu myInfoPoint Benutzern zu ändern bzw. anzulegen. Dies geschieht derzeit noch direkt auf der Datenbank und wird damit von IT erledigt. Der Auftrag hierzu kommt üblicherweise von Service, also Versicherungsbetrieb.

Um Wartezeiten für Versicherungsbetrieb zu minimieren und gleichzeitig die Arbeiten aus IT auszulagern ist für die anfallenden Aufgaben eine Weboberfläche zu erstellen, um die Aufgaben durch Versicherungsbetrieb ausführen zu lassen.


1. Einstellen / Ändern der Sicht eines Benutzers in myInfoPoint

1.1 Abfrage der Aktuellen Sicht
Für jeden Benutzer kann eine individuelle Sicht in myInfoPoint eingestellt werden. Dies kann auf mehreren Ebenen geschehen und wird in dieser Reihenfolge geprüft. Die letzte Zuordnung ist dann die gültige:

  1. Sicht aufgrund des zugrunde liegenden Vertriebsweges (der Kunde hat über einen Vermittler einen Versicherungsvertrag abgeschlossen und der Vermittler ist einem Vertriebsweg zugeordnet. Die Vertriebswege sind alle mit Sichten in myInfoPoint hinterlegt)
  2. Sicht aufgrund des Wunsches des Vermittlers für alle seine Kunden (zum Vermittler wurde auf dessen Veranlassung eine Sicht hinterlegt, die sich vom Vertriebsweg unterscheiden kann)
  3. Sicht aufgrund des Wunsches des Vermittlers für einen bestimmten Kunden (zum Kunden wurde auf Veranlassung des zugeordneten Vermittlers eine Sicht hinterlegt, die sich von den Sichten der anderen Kunden des Vermittlers unterscheiden kann)

Die aktuelle Einstellung zur Sicht erhält man z.B. über folgende Abfrage auf WEBDATA:

SELECT v.V_NR, r.P_NR, ov.VKVO, v.VERTRIEBSWEG_KZ, 
NVL(msz1.SICHT_KZ, 0) AS SICHT_VERTRIEBSWEG, NVL(msz2.SICHT_KZ, 0) AS SICHT_VKVO, NVL(msz3.SICHT_KZ, 0) AS SICHT_P_NR
FROM V@BSTDB v
INNER JOIN OBJ_VM@BSTDB ov ON v.V_NR = ov.OBJ_NR AND ov.OBJ_KZ = 1 AND ov.HIST_KZ = 2
INNER JOIN ROLLE@BSTDB r ON v.V_NR = r.V_NR AND r.R_KZ = 1
LEFT OUTER JOIN MLS_SICHT_ZUORDNUNG msz1 ON v.VERTRIEBSWEG_KZ = msz1.VERTRIEBSWEG_KZ
LEFT OUTER JOIN MLS_SICHT_ZUORDNUNG msz2 ON ov.VKVO = msz2.VKVO
LEFT OUTER JOIN MLS_SICHT_ZUORDNUNG msz3 ON r.P_NR = msz3.P_NR
WHERE v.HIST_KZ = 2
ORDER BY v.V_NR DESC;
Das Ergebnis der Abfrage muss auf einen Kunden (P_NR) oder einen Vermittler (VKVO) gefiltert werden um den jeweiligen Wert korrekt abzufragen.
Bei Abfrage auf einen Kunden (P_NR) gilt:
Die Abfrage kann keinen, einen oder mehrer Datensätze liefern. Wird kein Datensatz geliefert, hat der Kunde keinen Vertrag und damit Sicht 0, also keine Sicht. Dies ist allerdings nur ein theoretische Konstellation; die Abfrage auf einen 'Kunden' der keinen Vertrag hat, erscheint unsinnig; ein Kunde definiert sich dadurch, daß er einen Vertrag hat.
Wird genau ein Datensatz von der Abfrage geliefert, so liefert SICHT_P_NR die für den Kunden eingestellte Sicht. Ist der Wert 0, gilt der Wert aus SICHT_VKVO. Ist dieser Wert auch 0, liefert SICHT_VERTRIEBSWEG die gültige Sicht für den Kunden.
Werden mehrere Datensätze geliefert, so gilt der erste Datensatz (aktuellster Vertrag durch absteigende Sortierung nach V_NR) und damit wird so verfahren wie zuvor beim Ergebnis mit nur einem Datensatz beschrieben.
Bei der Abfrage auf einen Vermittler (VKVO) gilt:
Die Abfrage kann keinen, einen oder mehrer Datensätze liefern. Wird kein Datensatz geliefert, hat der Vermittler keinen Kunden mit einem gültigen Vertrag und damit alle seine Kunden Sicht 0, also keine Sicht. Auch dies ist nur eine theoretische Konstellation.
Wird genau ein Datensatz zurückgeliefert gilt der Wert aus SICHT_VKVO. Ist dieser Wert 0, liefert SICHT_VERTRIEBSWEG die gültige Sicht für den Kunden.
Bei mehreren Datensätzen wird wiederum der erste Datensatz betrachtet und wie zuvor bei genau einem Datensatz verfahren. Das Feld SICHT_P_NR hat bei der Abfrage auf einen Vermittler keine Relevanz.

1.2 Setzen der Sicht
Gesetzt wird die Sicht in der Tabelle MLS_SICHT_ZUORDNUNG

für einen Kunden:
INSERT INTO MLS_SICHT_ZUORDNUNG (ID, SICHT_KZ, P_NR, KOMMENTAR) VALUES (DEFAULT, [SICHT], [Kundennummer], '[Kommentar]');

für einen Vermittler:
INSERT INTO MLS_SICHT_ZUORDNUNG (ID, SICHT_KZ, VKVO, KOMMENTAR) VALUES (DEFAULT, [SICHT], [VKVO], '[Kommentar]');

Zu beachten ist, daß die Felder alle angegeben werden müssen. Also Kommentar kann der Benutzer einen kurzen Freitext angeben; Idealerweise wird der aktuelle Zeitstempel angefügt. Das Kommentarfeld ist nur beschreibend und wird derzeit nicht ausgewertet. Dennoch sollte es immer gefüllt sein.
Das Schreiben der Daten mit INSERT geschieht nur, wenn noch keine Daten hinterlegt waren. gibt es zu einem Kunden oder zu einem Vermittler bereits eine Zugeordnete Sicht, so wird diese nach Änderung durch den Benutzer mittels UPDATE aktualisiert. Es darf immer nur maximal einen Datensatz pro Vermittler und genau ein Datensatz pro Kunde in der Tabelle MLS_SICHT_ZUORDNUNG vorhanden sein.

1.3 Umsetzung
In einer Maske gibt der Benutzer entweder eine Kundennummer oder eine VKVO an. Wird beides angegeben, wird nur nach der Kundennummer gesucht. Wurden Daten gefunden (siehe 1.1) Werden die Informationen aus VKVO und Sicht in die Maske übernommen, der Benutzer kann die Sicht anpassen und dann seine Einstellung speichern, wodurch die Informationen in der Datenbank aktualisiert werden. Der Benutzer erhält eine entsprechende Meldung, die Daten aus den Eingabefeldern werden gelöscht und es kann bei Bedarf gleich eine neue Abfrage ausgeführt werden. Entsprechend sollten Suche, Dateneingabe und Ergebnis auf genau einer Seite durchgeführt werden; für Suche und Dateneingabe sollten die gleichen Felder verwendet werden. Die Sicht kann der Benutzer nicht frei eingeben, sondern wählen aus
1 - Eingeschränkte Sicht
2 - Volle Sicht
3 - Volle Sicht mit Aktionen

Sollte die Abfrage (siehe 1.1) den Wert 0 liefern, wird als Voreinstellung 1 (Eingeschränkte Sicht) gesetzt; ansonsten wird der ermittelte Wert als Voreinstellung übernommen.

2. Ändern eines Benutzernamens in myInfoPoint

Benutzer können über myInfoPoint eine Änderung Ihres Benutzernamens (= ihrer Emailadresse) beantragen. Dies bedeutet derzeit, daß die Emailadresse in VWS geändert durch Versicherungsbetrieb geändert wird und für myInfoPoint selbst durch IT geändert wird.

2.1 Prüfen des Benutzernamens

Um zu prüfen, ob der Benutzer in myInfoPoint existiert, nutzt man auf WEBSERVICES eine der folgenden Abfragen:

SELECT * FROM ASPNET_USERS au WHERE au.USERNAME = '[alter Username]';
SELECT * FROM ASPNET_USER_EXTENSIONS aue INNER JOIN ASPNET_USERS au ON aue.USERID = au.USERID WHERE aue.PNR = [Kundennummer];

[alter Username] bzw. [Kundennummer] sind durch die entsprechende Information zu ersetzen.

Die Abfrage sollte genau einen Datensatz zurückliefern. Wird kein Datensatz gefunden, so ist der Benutzer unter diesem Namen / mit dieser Kundennummer nicht in myInfoPoint registriert.

2.2 Ändern des Benutzernamens / der Emailadresse

Die Änderung für myInfoPoint betrifft sowohl den Benutzernamen als auch die Emailadresse. Obwohl beide Informationen identisch sind, werden sie getrennt verwaltet und sind entsprechend auch einzeln in WEBSERVICES zu ändern:

UPDATE ASPNET_USER_EXTENSIONS aue SET aue.MAIL = '[neuer Username]' WHERE aue.USERID = (SELECT au.USERID FROM ASPNET_USERS au WHERE au.USERNAME = '[alter Username]');
UPDATE ASPNET_USERS aue SET aue.USERNAME = '[neuer Username]' WHERE aue.USERID = (SELECT au.USERID FROM ASPNET_USERS au WHERE au.USERNAME = '[alter Username]');
[alter Username] bzw. [neuer Username] sind durch die entsprechende Information zu ersetzen.

2.3 Umsetzung
In einer Maske gibt der Benutzer wahlweise einen Benutzernamen oder eine Kundennummer ein und erhält den aktuell hinterlegten Benutzernamen in myInfoPoint. 
Wurde kein Eintrag gefunden, erhält der Benutzer eine entsprechende Meldung und kann dann seine Angaben ggf. Ändern und eine neue Abfrage durchführen.
Wurde ein Eintrag gefunden, hat der Benutzer die Möglichkeit, einen neuen Benutzernamen einzugeben und die Änderung durchführen zu lassen. der Wert wird dann sowohl als Benutzername als auch als Emailadresse übernommen. Die beiden Felder sind identisch zu führen; es werden entsprechend keine getrennten Eingabefelder hierfür angeboten.

3. Technische Umsetzung

Für die Umsetzung sind im folgenden technischen Aspekte zu beachten.

3.1 Zugriff auf die Datenbank
Der Zugriff erfolgt sowohl lesend als auch schreibend ausschließlich über EntityFramework. Für die Abfrage (siehe 1.1) ist der Zugriff auf Daten der Bestandsdatenbank (GUTINGIA, @BSTDB) notwendig, welche im Webkontext nicht erreichbar ist. Entsprechend ist hierfür eine View auf WEBDATA zu erstellen. Analog zu bisherigen Datenbankobjekte für myInfoPoint und zur schnelleren Einordnung beginnt der Name der View mit 'MLS_'.

3.2 Umsetzung als Services
Die Aktionen (Lesen der Daten, Schreiben von Daten) sind als REST-Services zu implementieren welche die Entities (3.1) verwenden.

3.3 Umsetzung der Webseite
Punkt 1 und Punkt 2 der Anforderungen sind in getrennten Seiten und jeweils als eine einzelne Seite umzusetzen. Die Seiten nutzen die REST-Services (3.2) um Daten abzufragen und zu schreiben.

Einrichten von Visual Studio für die Verwendung mit Visual Studio Team System

1. Download und Installation von Visual Studio 2015 Community Edition
Die Deutsche Version kann über https://www.visualstudio.com/de/downloads/ heruntergeladen werden; wer eine englische Version bevorzugt, kann stattdessen unter https://www.visualstudio.com/downloads/ die Community Edition laden.
Anschließend das Setup Aufrufen und die Installation durchführen.

2. Einrichten der Quellcodeverwaltung
Im Team Explorer von Visual Studio unter 'Projekte und Teams' Die Option 'Verbindungen verwalten' wählen und dort dann 'Mit Teamprojekt verbinden' Dort muss ein neuer Teamserver eingerichtet werden, wie auf dem Screenshot zu sehen:

3. Aktuelle Quellen holen
Unter Laufwerk D: ein neues Verzeichnis 'vso' erstellen und in Visual Studio im Source Control Explorer auf oberster Ebene dieses Verzeichnis verbinden. Anschließend einmal alle Quellen holen, die man benötigt.


Sind diese Schritte erledigt, kann wie gewohnt ein- und ausgechecked und gearbeitet werden.

4. Zusätzliche Tools für Visual Studio 2015

Unter Tools -> Extensions and Updates (Extra -> Erweiterungen und Aktualisierungen) finden sich eine Menge Erweiterungen zu Visual Studio. Zu Empfehlen sind:

  • Productivity Power Tools 2015
  • VSColorOutput
  • Web Extension Pack 2015

Diese lassen sich in diesem Dialog online suchen und installieren. Danach muss Visual Studio einmalig neu gestartet werden, damit die Erweiterungen aktiv werden.


5. Einstellung IIS Express in Visual Studio

Der IIS Express im VS muss auf 64 Bit gestellt werden, da sonst versucht wird die Fortis.Math.dll in 32 BIT zu laden. Dies stellt man wie folgt um:



6. Neuinstallation DotConnect for Oracle

Wenn man bereits DotConnect von DevArt installiert hat und anschließend eine neue Version von VS installiert (wie jetzt VS 2015), dann fehlt die DevArt Integration in VS. Diese benötigt man z.B., um die DevArt Lizenzinformationen einer Assembly hinzuzufügen. Daher sollte man nach der Installation von VS 2015 das DotConnect von DevArt nochmal deinstallieren und anschließend neu installieren.



6. Einrichten der nuGet Package Source von myLife

Unter Tools -> Options legt man eine neue Package Source an:


Models in Fortuna 5.0

Fortuna.models.Verwendung

Models werden bei Fortuna 5.0 in zwei zu nennenden Bereichen eingesetzt: 

  • Kommunikation zwischen Fortuna.Services und Fortuna.Clients. Hier beschreiben die Models die Objekte, die mittels REST übermittelt werden
  • Kommunikation zwischen Fortuna.Clients und der WebApplikation. Hier beschreiben die Services die Objekte, welche nach extern (z.B. HTML Frontend) geliefert werden.

Für die Kommunikation zwischen Service und Client bietet es sich an, zwischen Request- und Response-Models (Kommunikationswege aus Sicht des Clients) zu unterscheiden.

Bei der Kommunikation zwischen Client und WebApplikation wird man nur zum Teil gesonderte Models benötigen. Geht es um die reine Anzeige / Ausgabe von Daten, so ist möglicherweise das Response-Model aus der Service-Client Kommunikation direkt verwendbar. Bei der Datenpflege ist je nach Anwendungsfall zu entscheiden, ob die vorhandenen Models verwendet werden können, oder ob gesonderte Models benutzt werden und für die Weitergabe an die Services eine Transformation eingesetzt wird.

Ein Model beschreibt immer nur die Struktur eines Objektes und stellt keine eigene Funktionalitäten bereit. Datenmanipulationen sind nur in geringem Umfang im Model umzusetzen (Beispiel: aus den Eigenschaften Vorname und Nachname ein Feld Name bereitstellen, welches dann aus Nachname, Vorname oder auch Vorname Nachname besteht, oder eine IBAN in maschinenlesbarer und mit Leerstellen aufbereiteter Form zur Verfügung stellen).

Namespaces

Models liegen im Namespace Fortuna.Models. Applikationsspezifische Models entsprechend unter Fortuna.Models.MeineApp. Für Models, welche für Querschnittsfunktionalitäten genutzt werden, ist zu prüfen, ob diese entsprechend der Verwendung gruppiert werden können (also z.B. Fortuna.Models.Kommunikation.MeinModel). Ansonsten erfolgt die Zuordnung unter Fortuna.Models.Common (also z.B. Fortuna.Models.Common.MeinModel).

Bei der Unterscheidung nach Request- und Response-Models ist der Namespace Applikationsspezifisch entsprechend zu unterteilen (also Fortuna.Models.MeineApp.Request und Fortuna.Models.MeineApp.Response).

Da die gleichen Models möglicherweise in verschiedenen Projekten einer Applikation verwendet werden, sind diese in einem eigenen Projekt abzulegen. Das Projekt bekommt den Namen des Namespaces ungeachtet von möglicher Unterscheidung nach Request und Response (also im Beispiel Fortuna.Models.MeineApp.csproj). Models für Querschnittsfunktionalitäten werden in einem Projekt Fortuna.Models.Common abgelegt. Dies gilt auch bei einer vorgenommen Gruppierung.

Namespaces in Fortuna 5.0

Applikationsspezifische Namespaces

Clients konsumieren die von den Services zur Verfügung gestellten REST-Services. Ein Client konsumiert alle vom entsprechenden Service zur Verfügung gestellten Funktionalitäten. Ein Client konsumiert immer nur die Funktionalitäten genau eines Services. Der Client ist unter dem Namespace Fortuna.Client angeordnet. Ein Client für die Services aus Fortuna.Services.Vertrag wäre also unter Fortuna.Client.Vertrag zu finden. Der Client wird immer als eigenes Projekt implementiert; der Projektname entspricht dem Namespace (also im Beispiel Fortuna.Client.Vertrag.csproj). Die Daten zwischen Client und Service werden über Models ausgetauscht. Weiteres zu Models siehe unter http://webentw3.gutingia.local/blog/post/2017/01/26/models-in-fortuna-5-0.

Der Client selbst wird dann von der eigentlichen WebApplikation verwendet. Die WebApplikation ist im Namespace Fortuna.Web angeordnet (und wäre dann unter Fortuna.Web.MeineApp zu finden). Das Projekt der WebApplikation entspricht auch hier dem Namespace (also im Beispiel Fortuna.Web.MeineApp.csproj). Eine WebApplikation kann mehrere Clients benutzen um Funktionalitäten abzubilden. Genauso können Clients in verschiedenen WebApplikationen Verwendung finden.

Entities, Datalayer, Models und Services

Entities sind unter Fortuna.Entities eingeordnet. Entitäten sind unabhängig von einer Webapplikation und entsprechen letztlich einer Tabelle oder View im Datenbankuser 'Fortuna'. Um bereits in den Entities unterscheiden zu können, sind Tabellen bereits mit T_[Objekt], Views mit V_[Objekt] zu benennen. Entsprechend beginnen dann die Entitäten auf Tabellen mit 't' (t[Objekt]) und Views mit 'v' (v[Objekt]).
Beispiel: Personen liegen in der View V_Person und daraus ergibt sich die Entität (inkl. Namespace) Fortuna.Entities.vPerson

Bei der Anlage von Tabellen und Views ist entsprechend schon sorgfältig auf die Namensvergabe zu achten.

Entities werden in einem eigenen Projekt 'Fortuna.Entities' angelegt. Sollten im Laufe der Entwicklung sehr viele Entitäten anfallen, ist zu überlegen, ob man diese thematisch in mehrere Projekte aufteilt, der Namespace bleibt Projektübergreifend aber immer Fortuna.Entities.
Die Aufteilung sollte in keinem Falle anwendungsspezifisch sein, da der allergrößte Teil der Entitäten immer in verschiedenen Applikationen Verwendung finden wird. Wenn man bereits zu Beginn einer neuen Applikation ansehen kann, daß eine Reihe von Entitäten sehr Anwendungsspezifisch sein werden und aller Voraussicht nach nur für diese eine Anwendung zur Verfügung stehen müssen, so kann für diese ein gesondertes Projekt erstellt werden, welches dann aber auch unter dem Namespace Fortuna.Entities agiert.

Die Entities sind in einem Projekt mit einen Datenlayer abzulegen. Dieser Datenlayer sorgt dafür, daß die Informationen aus den Entities über Models weitergegeben werden. Weiteres zu Models siehe unten. Die Methoden des Datenlayers sind nach außen nicht sichtbar. Die Objekte, welche über den ORM Mapper für die Entities erzeugt werden, werden nicht über Services nach 'außen' verwendet; es ist immer eine Transformation in Models vorzunehmen.

Die Weitergabe der Models an die weiter oben liegende Clients erfolgt über Services, welche über REST ansprechbar sind. Services sind meist recht atomar und applikationsunabhängig. Sie wären also unter Fortuna.Services zu finden. Die Namensvergabe der Objekte sollte Aufschluss über die darin gebündelten/verwendeten Entities geben (Beispiel: Fortuna.Services.Vertrag bündelt Entitäten zu Vertrag, Vertragsteil, Vertragswerte etc.)

Entities, Datenlayer und Services können je nach Umfang in einem gemeinsamen Projekt abgelegt werden oder die Services von den Entities getrennt in unterschiedlichen Projekten. Bei einem Projekt für alles, ist das Projekt thematisch passend zu benennen (etwa Fortuna.Services.Vertrag.csproj). Bei getrennten Projekten werden als Projektnamen die Namen der Namespaces von Entitäten und Services verwendet (also Fortuna.Entities.Vertrag.csproj und Fortuna.Services.Vertrag.csproj)
Sollte es bei den Entitäten Applikationsspezifische Objekte geben, so erhalten diese auch einen eigenen Datenlayer, ggf. eigene Models und eigene Services. Gemeinsam sind diese dann auch in einem eigenen Projekt abzulegen. Der Applikationsname sollte sich im Projektnamen der Entities/des Datalayers/der Services wiederspiegeln.

Weitere Objekte

Eine ganze Reihe von Funktionen und Informationen sind unabhängige von einer bestimmten Applikation sondern mehrfach einsetzbar. In diesem Falle sind gesonderte Namespaces zu verwenden. Als Beispiele sind hier Fortuna.Globals und Fortuna.Configuration zu nennen. Bei der Vergabe von Namespaces ist darauf zu achten, daß diese nicht mit bestehenden Namespaces übereinstimmen. Vor allem die oben verwendeten Begriffe bei Anwendungsspezifischen Namespaces dürfen nicht verwendet werden.
So könnte es z.B. durchaus zu Problemen kommen, wenn eine Anwendung sowohl Fortuna.Services.MeineApp verwendet als auch Fortuna.MeinNamespace.Services.MeineApp. Insbesondere, wenn sich dann in den Namespace Klassen finden, die auch identische Namen haben.


Architektur Fortuna 5.0


Fortuna Anwendungen lassen sich grob in  drei Schichten teilen:

  • Datenbank
  • Daten- und sonstige Services
  • Webapplikation

Die Kommunikation zwischen den Schichten ist immer identisch, unabhängig davon, um welchen fachlichen Themenbereich es sich handelt.

Die Komponenten in den einzelnen Schichten folgen stets festgelegten Vorgehensweisen, Zugriffsarten und Namensgebungen, sodass man unabhängig der fachlichen Aspekte aus technischer Sicht schnell ein Zuordnung findet.

Alle weiteren Erläuterungen beziehen sich zwar auf die derzeitige Infrastruktur der Produktionsumgebung, sind aber auch in der Test- und Entwicklungsumgebung und bei Austausch einzelner Teile der Infrastruktur adaptiv anzuwenden. Die Beschreibungen beziehen sich - wenn nicht anders beschrieben - immer auf den Kontext Webapplikationen und Kommunikation nach Extern.

Datenbank

Alle Daten der Bestandsverwaltung sind auf DBPROD1 im User GUTINGIA abgelegt. Hinzu kommen noch Dokumente, die als Binärobjekte sind auf DBDOK1 im User DBDOK abgelegt sind. Letztere sind gesondert zu behandeln.

Neu hinzu kommt nun der User FORTUNA auf DBPROD1. Dieser User soll perspektivisch als einziger "Kontaktpunkt" für den Datenzugriff dienen und die Benutzer WEBDATA, WEBFRW und WEBSERVICES ersetzen. Webapplikationen verwenden letztlich nur noch diesen User zum Lesen und Schreiben von Daten. Hierbei gelten einige Regeln:

  • Der lesende Zugriff auf Daten geschieht ausschließlich über Views. Benötigt eine Anwendung also Informationen aus GUTINGIA, so ist auf Fortuna eine View zu erstellen, welche die Daten aus GUTINGIA holt und in FORTUNA bereitstellt. Die Webanwendung greift auf diese View zu.
  • Der schreibende Zugriff auf Daten geschieht ausschließlich im Datenbankuser FORTUNA. Daten, welche nachfolgend von GUTINGIA benötigt werden (Stichwort: Dunkelverarbeitung) werden von GUTINGIA aus diesen Tabellen gelesen.
  • Es findet kein direkter schreibender Zugriff auf Tabellen im Datenbankuser GUTINGIA statt.
  • Der lesende Zugriff auf Tabellen, welche unter FORTUNA liegen kann wahlweise direkt oder über eine View erfolgen. Hier wäre allerdings auch eine View zu bevorzugen, wodurch dann in den darüber liegenden Entitäten schon über die Entität selbst klar wäre, ob es sich um lesende oder schreibende Zugriffe handelt.

Daten- und sonstige Services

Jeglicher Datenbankzugriff (lesend und schreibend), Zugriff auf Dokumente, Mailversand, Versand von SMS und alle weiteren nicht fachlich definierten sind hier zu implementieren.

Der Zugriff (lesend und schreibend) auf die Datenbank erfolgt ausschließlich über das Entity Framework und der einzige zu verwendende Datenbankbenutzer ist FORTUNA.

Für die Kommunikation zu WebApplikationen werden in dieser Schicht REST-Services zur Verfügung gestellt welche über dedizierte Clientbibliotheken konsumiert werden können. Alle Funktionalitäten sich auf diese Weise zu kapseln.

In der Entwicklung von Klassen und Funktionen ist die korrekte Benennung von Namespaces zu beachten (Weiteres hierzu siehe unter http://webentw3.gutingia.local/blog/post/2017/01/26/namespaces-in-fortuna-5-0)

Webapplikationen

Jegliche Anwendung, die für eine Kommunikation nach Extern verwendet wird, ist in dieser Schicht angesiedelt. Dies betrifft natürlich vor allem Anwendungen mit einem HTML-Frontend, aber auch Services, welche für externe Partner zur Verfügung gestellt werden.

Der Zugriff auf die Daten- und sonstigen Services (siehe oben) erfolgt ausschließlich über Client Bibliotheken, welche dann über REST kommunizieren. Es gibt keinen direkten Zugriff auf Funktionalitäten dieser Schicht.


Umstellung auf Visual Studio Online

Nachfolgend zu unserem Metting vom 22.12.2016 habe ich mal diverse Punkte zusammengetragen, die besprochen wurden bzw. die bis zum/am/nach dem vereinbarten nächsten Termin (2.2.2017) mit Herrn Schmitt/devdeer/Bechtle anstehen bzw. besprochen / behandelt werden müssen.

Ich habe der Mindmap mal ganz grob Symbole zugeordnet: 

Die Personen bezeichnen Tätigkeiten die zusammen mit Herrn Schmitt durchzuführen sind

Der grüne Haken kennzeichnet bis zum Termin erledigte Tätigkeiten

Das orangene Ausrufezeichen markiert die Punkte, die die zum Termin erledigt / besprochen werden sollten

Das blaue Fragezeichen zeigt offene Punkte / Fragen, die z.T. vorab, z.T. im Rahmen des Termins zu klären sind.

Wer keinen MindManager hat, kann sich das meiste auch im PDF ansehen. Änderungen / Erweiterungen kann ich gerne in der Mindmap nachtragen und hier aktualisieren und dann auch ein weiteres PDF hier anhängen.

Umstellung auf VSO 2017-01-03.pdf (243,2KB)