====== Plugins (Standarderweiterungen) ====== Diese Art von Plugins ermöglicht es, in die Standardlogik aller CAATS-Dienste einzugreifen, und so das Verhalten der Standardfunktionen mit individuellen Programmierungen zu beeinflussen. ===== Beschreibung ===== Die Standardfunktionen und Einsprungpunkte sind: - Abrufen einzelner Datensätze (vor Datenbankzugriff) - Abrufen einzelner Datensätze (nach Datenbankzugriff) - Abrufen einer Liste von Datensätzen (vor Datenbankzugriff) - Abrufen einer Liste von Datensätzen (nach Datenbankzugriff) - Neuen Datensatz mit Initialwerten anfordern - Anlegen (vor Speicherung) - Anlegen (nach Speicherung) - Aktualisieren (vor Speicherung) - Aktualisieren (nach Speicherung) - Löschen (vor Speicherung) Wird eine dieser Standardfunktionen durch ein Plugin ergänzt, so steht es dem Autor des Plugins frei, die übergebenen Daten zu verwerfen, beizubehalten, abzuändern, oder durch eigene zu ersetzen. Im Falle des Abrufens einer Liste von Datensätzen (Punkt 3) steht es dem Autor des Plugins außerdem frei, die übergebenen Filter-, Sortierungs- und Gruppierungskriterien vor dem Ausführen des Datenbankzugriffes zu ändern. ===== Beispiel ===== Dieses Beispiel ersetzt den Vornamen aller neu angelegten Klienten durch den Vornamen "Franz". Es dient nur zu Schulungszwecken und sollte nicht in einem Echtsystem eingesetzt werden. using Grpc.Core; using System; using System.Security.Cryptography; using System.Threading.Tasks; using Caats.Infrastructure.Authorization; using Caats.Infrastructure.Constants; using Caats.Infrastructure.Helper; using Caats.Proto; using Caats.Services.PersonAPI.Infrastructure; using Caats.Services.PersonAPI.Repositories; namespace Caats.Service.Infrastructure.Extensibility; [PluginServiceDto(typeof(PersonDto))] public class MyTestCaatsPersonPlugin : PluginBase { private readonly IPersonRepository _repository; public MyTestCaatsPersonPlugin(IPersonRepository repository) { _repository = repository; } public override PluginDto Ident() => new() { }; public async override Task<(RequestMsg, ResponseMsg?)> OnBeforeCreate(RequestMsg request, Lazy identity, ServerCallContext context) { var candidate = RequestMsgHelper.GetSingleOrDefault(request); candidate.GivenName = "Alle heißen Franz"; var modified = RequestMsgHelper.CreateWithSingle(candidate); modified.PartitionIndex = request.PartitionIndex; return (modified, null); } } ===== Fehlercodes und Lösungen ===== Beim Programmieren von standarderweiternden Plugins können - abseits von den Warnungen und Fehlermeldungen des C# Compilers - folgende CAATS-spezifische Fehlercodes vorkommen: ^ Fehlercode ^ Bedeutung ^ Lösung ^ | CAATS0001 | No suitable public type for installable plugin \\ //Each kind of plugin must use a well-known namespace and interface/base type for its main class, so the automation can instantiate and call it// | Definiern Sie in Ihrem Skript eine öffentliche Klasse des verlangten Basistyps | | CAATS0003 | Installable plugin exposes more than one plugin type \\ //Each plugin script must export exactly one main class that satisfies the automator's type constraints// | Reduzieren Sie die Anzahl der öffentlichen Klassen des angegebenen Basistyps in Ihrem Skript auf 1 |