OmniSeller:PlugIn Entwicklung: Unterschied zwischen den Versionen

Zur Navigation springen Zur Suche springen
keine Bearbeitungszusammenfassung
(Die Seite wurde neu angelegt: „OmniSeller PlugIn Entwicklung Überblick Der OmniSeller DataService bietet die Möglichkeit, externe Logik über PlugIns zu integrieren. PlugIns können entwickelt werden, um spezifische Geschäftsanforderungen zu erfüllen, beispielsweise das Anpassen von Produktdaten vor dem Upload oder das Modifizieren von Preisen basierend auf bestimmten Kriterien. OmniSeller PlugIns basieren auf .NET Standard 2.0, um sowohl mit alten (.NET Framework 4.7.2) als auch…“)
 
Keine Bearbeitungszusammenfassung
Zeile 1: Zeile 1:
OmniSeller PlugIn Entwicklung
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary dark:bg-gray-950"><div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre hljs language-mediawiki">= OmniSeller PlugIn Entwicklung =
Überblick
 
== Überblick ==
Der OmniSeller DataService bietet die Möglichkeit, externe Logik über PlugIns zu integrieren. PlugIns können entwickelt werden, um spezifische Geschäftsanforderungen zu erfüllen, beispielsweise das Anpassen von Produktdaten vor dem Upload oder das Modifizieren von Preisen basierend auf bestimmten Kriterien.
Der OmniSeller DataService bietet die Möglichkeit, externe Logik über PlugIns zu integrieren. PlugIns können entwickelt werden, um spezifische Geschäftsanforderungen zu erfüllen, beispielsweise das Anpassen von Produktdaten vor dem Upload oder das Modifizieren von Preisen basierend auf bestimmten Kriterien.


OmniSeller PlugIns basieren auf .NET Standard 2.0, um sowohl mit alten (.NET Framework 4.7.2) als auch mit neuen (.NET 6.0) Service-Versionen kompatibel zu sein.
OmniSeller PlugIns basieren auf '''.NET Standard 2.0''', um sowohl mit alten (.NET Framework 4.7.2) als auch mit neuen (.NET 6.0) Service-Versionen kompatibel zu sein.
 
Voraussetzungen
Entwicklungsumgebung:
 
Visual Studio 2019 oder höher.
.NET Standard 2.0 als Zielplattform für PlugIns.
Abhängigkeiten:
 
OmniSeller.Common und OmniSeller.Enums aus dem HTK NuGet Repository:
arduino
Code kopieren
https://htkpackages/repository/
Nützliche Schnittstellen und Modelle:


IEntryPointPlugin (aus OmniSeller.Common).
== Voraussetzungen ==
Enums.EntryPoint und Enums.ShopTypes.
# '''Entwicklungsumgebung''':
Zugriff auf ein bestehendes OmniSeller-System, um das PlugIn zu testen.
#* Visual Studio 2019 oder höher.
#* .NET Standard 2.0 als Zielplattform für PlugIns.
# '''Abhängigkeiten''':
#* `OmniSeller.Common` und `OmniSeller.Enums` aus dem **HTK NuGet Repository**:
# ```plaintext
# https://htkpackages/repository/
# ```
# '''Nützliche Schnittstellen und Modelle''':
#* `IEntryPointPlugin` (aus `OmniSeller.Common`).
#* `Enums.EntryPoint` und `Enums.ShopTypes`.
# '''Zugriff auf ein bestehendes OmniSeller-System''', um das PlugIn zu testen.


Struktur eines OmniSeller PlugIns
== Struktur eines OmniSeller PlugIns ==
Ein OmniSeller PlugIn muss die Schnittstelle IEntryPointPlugin implementieren, die folgende Eigenschaften und Methoden definiert:
Ein OmniSeller PlugIn muss die Schnittstelle `IEntryPointPlugin` implementieren, die folgende Eigenschaften und Methoden definiert:


csharp
```csharp
Code kopieren
public interface IEntryPointPlugin
public interface IEntryPointPlugin
{
{
Zeile 40: Zeile 37:
     Product Call(ShopTypes shopType, int portalID, Product productObj, EntryPoint entryPoint); // Hauptlogik
     Product Call(ShopTypes shopType, int portalID, Product productObj, EntryPoint entryPoint); // Hauptlogik
}
}
Beispiel für ein PlugIn: ZeroPricePlugIn
</code></div></div><p>=== Beispiel für ein PlugIn: ZeroPricePlugIn === Dieses PlugIn setzt automatisch den niedrigsten Preis für Produkte, die den Preis <code>0</code> haben, basierend auf den Preisen der Kind-Produkte.</p><div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary dark:bg-gray-950"><div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between rounded-t-md h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none">csharp</div><div class="sticky top-9 md:top-[5.75rem]"><div class="absolute bottom-0 right-2 flex h-9 items-center"><div class="flex items-center rounded bg-token-sidebar-surface-primary px-2 font-sans text-xs text-token-text-secondary dark:bg-token-main-surface-secondary"><button class="flex gap-1 items-center select-none py-1">Code kopieren</button></div></div></div><div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre hljs language-csharp"><span class="hljs-keyword">using</span> OmniSeller.Enums;
Dieses PlugIn setzt automatisch den niedrigsten Preis für Produkte, die den Preis 0 haben, basierend auf den Preisen der Kind-Produkte.
<span class="hljs-keyword">using</span> OmniSellerPlugins.Interfaces;
<span class="hljs-keyword">using</span> OmniSellerPlugins.Models;
<span class="hljs-keyword">using</span> System;


csharp
<span class="hljs-keyword">namespace</span> <span class="hljs-title">OmniSeller.PlugIns</span>
Code kopieren
using OmniSeller.Enums;
using OmniSellerPlugins.Interfaces;
using OmniSellerPlugins.Models;
using System;
 
namespace OmniSeller.PlugIns
{
{
     internal class ZeroPricePlugIn : IEntryPointPlugin
     <span class="hljs-keyword">internal</span> <span class="hljs-keyword">class</span> <span class="hljs-title">ZeroPricePlugIn</span> : <span class="hljs-title">IEntryPointPlugin</span>
     {
     {
         public string Name => "OmniSellerZeroPricePlugIn";
         <span class="hljs-keyword">public</span> <span class="hljs-built_in">string</span> Name =&gt; <span class="hljs-string">"OmniSellerZeroPricePlugIn"</span>;
         public EntryPoint SupportedEntryPoints => EntryPoint.PRICE_BEFORE_UPLOAD;
         <span class="hljs-keyword">public</span> EntryPoint SupportedEntryPoints =&gt; EntryPoint.PRICE_BEFORE_UPLOAD;
         public string Version => "1.0.0.0";
         <span class="hljs-keyword">public</span> <span class="hljs-built_in">string</span> Version =&gt; <span class="hljs-string">"1.0.0.0"</span>;
         public int SortOrder => 1000;
         <span class="hljs-keyword">public</span> <span class="hljs-built_in">int</span> SortOrder =&gt; <span class="hljs-number">1000</span>;
         public string Author => "AS";
         <span class="hljs-keyword">public</span> <span class="hljs-built_in">string</span> Author =&gt; <span class="hljs-string">"AS"</span>;
         public string Publisher => "HTK GmbH & Co.KG";
         <span class="hljs-keyword">public</span> <span class="hljs-built_in">string</span> Publisher =&gt; <span class="hljs-string">"HTK GmbH & Co.KG"</span>;
         public ShopTypes SupportedShopTypes => ShopTypes.Magento;
         <span class="hljs-keyword">public</span> ShopTypes SupportedShopTypes =&gt; ShopTypes.Magento;
         public string Notes => "Kein Hinweistext";
         <span class="hljs-keyword">public</span> <span class="hljs-built_in">string</span> Notes =&gt; <span class="hljs-string">"Kein Hinweistext"</span>;


         public ZeroPricePlugIn()
         <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-title">ZeroPricePlugIn</span>()</span>
         {
         {
             Console.WriteLine($"Running PlugIn {Name}");
             Console.WriteLine(<span class="hljs-string">$"Running PlugIn <span class="hljs-subst">{Name}</span>"</span>);
         }
         }


         public Product Call(ShopTypes shopType, int portalID, Product productObj, EntryPoint entryPoint)
         <span class="hljs-function"><span class="hljs-keyword">public</span> Product <span class="hljs-title">Call</span>(<span class="hljs-params">ShopTypes shopType, <span class="hljs-built_in">int</span> portalID, Product productObj, EntryPoint entryPoint</span>)</span>
         {
         {
             Console.WriteLine($"Running PlugIn {Name} for {shopType} at {entryPoint}");
             Console.WriteLine(<span class="hljs-string">$"Running PlugIn <span class="hljs-subst">{Name}</span> for <span class="hljs-subst">{shopType}</span> at <span class="hljs-subst">{entryPoint}</span>"</span>);
             if (shopType == ShopTypes.Magento)
             <span class="hljs-keyword">if</span> (shopType == ShopTypes.Magento)
             {
             {
                 // Logik zur Anpassung von Produktpreisen
                 <span class="hljs-comment">// Logik zur Anpassung von Produktpreisen</span>
             }
             }
             return productObj;
             <span class="hljs-keyword">return</span> productObj;
         }
         }
     }
     }
}
}
Schritt-für-Schritt-Anleitung zur Erstellung eines PlugIns
</code></div></div><p>== Schritt-für-Schritt-Anleitung zur Erstellung eines PlugIns == === 1. Projekt einrichten ===</p>
1. Projekt einrichten
*Erstelle ein neues '''.NET Standard 2.0''' Class Library-Projekt in Visual Studio.
Erstelle ein neues .NET Standard 2.0 Class Library-Projekt in Visual Studio.
*Füge die folgenden Pakete über das HTK NuGet Repository hinzu:
Füge die folgenden Pakete über das HTK NuGet Repository hinzu:
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary dark:bg-gray-950"><div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between rounded-t-md h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none">plaintext</div><div class="sticky top-9 md:top-[5.75rem]"><div class="absolute bottom-0 right-2 flex h-9 items-center"><div class="flex items-center rounded bg-token-sidebar-surface-primary px-2 font-sans text-xs text-token-text-secondary dark:bg-token-main-surface-secondary"><button class="flex gap-1 items-center select-none py-1">Code kopieren</button></div></div></div><div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre hljs language-plaintext">OmniSeller.Common
Code kopieren
OmniSeller.Common
OmniSeller.Enums
OmniSeller.Enums
2. PlugIn-Logik implementieren
</code></div></div><p>=== 2. PlugIn-Logik implementieren ===</p>
Implementiere die Schnittstelle IEntryPointPlugin.
*Implementiere die Schnittstelle <code>IEntryPointPlugin</code>.
Definiere die unterstützten EntryPoints und ShopTypes.
*Definiere die unterstützten <code>EntryPoints</code> und <code>ShopTypes</code>.
Implementiere die Logik in der Methode Call.
*Implementiere die Logik in der Methode <code>Call</code>.
3. PlugIn erstellen und veröffentlichen
<p>=== 3. PlugIn erstellen und veröffentlichen ===</p>
Kompiliere das Projekt.
*Kompiliere das Projekt.
Die resultierende .dll-Datei (zusammen mit ihren Abhängigkeiten) wird in das OmniSeller PlugIn-Verzeichnis kopiert:
*Die resultierende <code>.dll</code>-Datei (zusammen mit ihren Abhängigkeiten) wird in das OmniSeller PlugIn-Verzeichnis kopiert:
makefile
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary dark:bg-gray-950"><div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between rounded-t-md h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none">plaintext</div><div class="sticky top-9 md:top-[5.75rem]"><div class="absolute bottom-0 right-2 flex h-9 items-center"><div class="flex items-center rounded bg-token-sidebar-surface-primary px-2 font-sans text-xs text-token-text-secondary dark:bg-token-main-surface-secondary"><button class="flex gap-1 items-center select-none py-1">Code kopieren</button></div></div></div><div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre hljs language-plaintext">C:\OmniVersum\Apps\OmniSellerService2\PlugIns
Code kopieren
</code></div></div><p>=== 4. PlugIn testen ===</p>
C:\OmniVersum\Apps\OmniSellerService2\PlugIns
*Starte den OmniSeller DataService und beobachte die Logs.
4. PlugIn testen
*Das PlugIn wird automatisch geladen und ausgeführt, wenn der entsprechende <code>EntryPoint</code> erreicht wird.
Starte den OmniSeller DataService und beobachte die Logs.
<p>== EntryPoints und deren Bedeutung == {| class="wikitable" |- ! EntryPoint</p>
Das PlugIn wird automatisch geladen und ausgeführt, wenn der entsprechende EntryPoint erreicht wird.
{|<thead>
EntryPoints und deren Bedeutung
|-
EntryPoint Beschreibung
! ! Beschreibung</thead>
PORTAL_STARTUP Wird beim Start eines Portals ausgeführt.
|-
PRODUCT_BEFORE_UPLOAD Vor dem Produkt-Upload.
| <code>PORTAL_STARTUP</code>
PRODUCT_AFTER_UPLOAD Nach dem Produkt-Upload.
|-
PRICE_BEFORE_UPLOAD Vor dem Preis-Upload.
| Wird beim Start eines Portals ausgeführt.
PRICE_AFTER_UPLOAD Nach dem Preis-Upload.
|-
ORDER_AFTER_DOWNLOAD Nach dem Herunterladen einer Bestellung.
| -
Best Practices für PlugIns
|-
Vermeide lange Blockaden:
| <code>PRODUCT_BEFORE_UPLOAD</code>
 
|-
Die Methode Call sollte möglichst schnell ausgeführt werden, um Verzögerungen im DataService zu vermeiden.
| Vor dem Produkt-Upload.
Fehlerbehandlung:
|-
 
| -
Verwende try-catch, um Laufzeitfehler zu verhindern, die den gesamten Service beeinflussen könnten.
|-
Testumgebung nutzen:
| <code>PRODUCT_AFTER_UPLOAD</code>
 
|-
Teste das PlugIn in einer Entwicklungs- oder Staging-Umgebung, bevor es in die Produktion übernommen wird.
| Nach dem Produkt-Upload.
Log-Ausgaben:
|-
 
| -
Nutze Console.WriteLine, um wichtige Informationen und Debug-Daten während der PlugIn-Ausführung zu loggen.
|-
Beispielhafte Ordnerstruktur
| <code>PRICE_BEFORE_UPLOAD</code>
makefile
|-
Code kopieren
| Vor dem Preis-Upload.
C:\OmniVersum\Apps\OmniSellerService2\
|-
| -
|-
| <code>PRICE_AFTER_UPLOAD</code>
|-
| Nach dem Preis-Upload.
|-
| -
|-
| <code>ORDER_AFTER_DOWNLOAD</code>
|-
| Nach dem Herunterladen einer Bestellung.
|-
| }
|}
<p>== Best Practices für PlugIns ==</p>
= '''Vermeide lange Blockaden''': =
<p>#* Die Methode <code>Call</code> sollte möglichst schnell ausgeführt werden, um Verzögerungen im DataService zu vermeiden.</p>
= '''Fehlerbehandlung''': =
<p>#* Verwende <code>try-catch</code>, um Laufzeitfehler zu verhindern, die den gesamten Service beeinflussen könnten.</p>
= '''Testumgebung nutzen''': =
<p>#* Teste das PlugIn in einer Entwicklungs- oder Staging-Umgebung, bevor es in die Produktion übernommen wird.</p>
= '''Log-Ausgaben''': =
<p>#* Nutze <code>Console.WriteLine</code>, um wichtige Informationen und Debug-Daten während der PlugIn-Ausführung zu loggen.</p><p>== Beispielhafte Ordnerstruktur ==</p><div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary dark:bg-gray-950"><div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between rounded-t-md h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none">plaintext</div><div class="sticky top-9 md:top-[5.75rem]"><div class="absolute bottom-0 right-2 flex h-9 items-center"><div class="flex items-center rounded bg-token-sidebar-surface-primary px-2 font-sans text-xs text-token-text-secondary dark:bg-token-main-surface-secondary"><button class="flex gap-1 items-center select-none py-1">Code kopieren</button></div></div></div><div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre hljs language-plaintext">C:\OmniVersum\Apps\OmniSellerService2\
├── PlugIns\
├── PlugIns\
│  ├── OmniSellerZeroPricePlugIn.dll
│  ├── OmniSellerZeroPricePlugIn.dll
Zeile 129: Zeile 142:
│  ├── OmniSeller.Enums.dll
│  ├── OmniSeller.Enums.dll
├── OmniSellerService.exe
├── OmniSellerService.exe
Häufige Fehler und Lösungen
</code></div></div><p>== Häufige Fehler und Lösungen ==</p>
PlugIn wird nicht geladen:
= '''PlugIn wird nicht geladen''': =
 
<p>#* Überprüfe, ob die <code>IEntryPointPlugin</code>-Schnittstelle korrekt implementiert wurde. #* Stelle sicher, dass alle Abhängigkeiten (z. B. <code>OmniSeller.Common</code>) verfügbar sind.</p>
Überprüfe, ob die IEntryPointPlugin-Schnittstelle korrekt implementiert wurde.
= '''Assembly-Version inkompatibel''': =
Stelle sicher, dass alle Abhängigkeiten (z. B. OmniSeller.Common) verfügbar sind.
<p>#* Stelle sicher, dass die Hauptanwendung und das PlugIn dieselben Versionen von <code>OmniSeller.Common</code> und <code>OmniSeller.Enums</code> verwenden.</p>
Assembly-Version inkompatibel:
= '''Kein <code>EntryPoint</code> aktiviert''': =
 
<p>#* Prüfe, ob der EntryPoint des PlugIns (<code>SupportedEntryPoints</code>) mit dem vom Service ausgelösten EntryPoint übereinstimmt.</p><p>Falls es weitere Fragen oder Probleme gibt, wende dich an das '''OmniSeller-Entwicklungsteam'''.</p>
Stelle sicher, dass die Hauptanwendung und das PlugIn dieselben Versionen von OmniSeller.Common und OmniSeller.Enums verwenden.
Kein EntryPoint aktiviert:
 
Prüfe, ob der EntryPoint des PlugIns (SupportedEntryPoints) mit dem vom Service ausgelösten EntryPoint übereinstimmt.
Falls es weitere Fragen oder Probleme gibt, wende dich an das OmniSeller-Entwicklungsteam.
1.381

Bearbeitungen

Navigationsmenü