.NET Core Projektstruktur

In diesem Blogpost erkunde ich eine Möglichkeit, auf Basis von .NET Core eine Applikation so zu entwickeln, dass verschiedene Benutzungsoberflächen “draufgesetzt” werden können. Natürlich wird es wieder eine OPC UA-Anwendung. Den Anwendungskern (die sogenannte business logic) bildet ein C#-Projekt, das die Funktionalitäten des UA-Stacks so verfügbar macht, wie es für den jeweiligen Use Case gebraucht wird. Dieses Projekt wird dann von den zwei User Interfaces (Konsole und Weboberfläche) referenziert. Folgende Projektstruktur entsteht:

Für einen ersten Test nehme ich wieder den Local Discovery Server der OPC Foundation, dessen Endpunkte abgefragt werden.

Die wesentlichen Schritte zum Erzeugen und Verbinden der einzelnen Projekte zeige ich hier. Das Programm befindet sich im zugehörigen Github-Repository.

Zuerst erstellen wir einen Wurzelordner, in dem wir die Projekte anlegen möchten und wechseln dort hinein.

Anschließend werden die Projekte für die Businesslogik und das Konsoleninterface angelegt:

dotnet new classlib -o logic
dotnet new console -o console
-o [name] gibt den Namen des Unterordners an, in dem das jeweilige Projekt erstellt wird.

Anschließend in den Ordner des Konsolen-Projekts wechseln und eine Referenz auf das logic-Projekt erzeugen:

dotnet add reference ../logic/logic.csproj

Um nun mit dem logic-Projekt etwas anfangen zu können, wird das SDK der OPC Foundation über nuget eingebunden. Die zugehörige Website liefert direkt den passenden Befehl für dotnet.

Einbinden des nuget-Pakets

Dieser Befehl kann kopiert und im Ordner der logic.csproj-Datei per Kommandozeile ausgeführt werden.

Um nun ein Projekt für die Weboberfläche zu erzeugen, wechseln wir wieder in den Wurzelordner und führen, ähnlich wie oben, folgendes aus:
dotnet new razor -o Web
cd Web
dotnet add reference ../logic/logic.csproj

Anschließend kann ein Build ausgeführt werden, um zu schauen, ob alles geklappt hat. Razor ist die Standard-Vorlage für Webapps. Wir hätten genauso gut dotnet new webapp tippen können.

Das logic-Projekt stellt eine Funktion zur Verfügung, die eine Liste der verfügbaren Endpunkte liefert. Diese Funktion wird von beiden User Interfaces gleichermaßen genutzt und das Ergebnis angezeigt.

Konsolen-Interface

Web-Interface

Zu guter Letzt

Mit dieser einfachen Grundstruktur ist es möglich, die Logik einer Applikation von ihrer Darstellung zu trennen.

Das zugehörige Repository mit meinem Beispielcode finden Sie hier.