1.488
Bearbeitungen
Admin (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
Admin (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
||
Zeile 1: | Zeile 1: | ||
<br> | <h1>OmniSeller PlugIn Entwicklung</h1><br><h2>Überblick</h2><br><p><br> Der OmniSeller DataService bietet die Möglichkeit, externe Logik über PlugIns zu integrieren. PlugIns können entwickelt werden,<br> um spezifische Geschäftsanforderungen zu erfüllen, beispielsweise das Anpassen von Produktdaten vor dem Upload oder das<br> Modifizieren von Preisen basierend auf bestimmten Kriterien.<br></p><br><p><br> OmniSeller PlugIns basieren auf <b>.NET Standard 2.0</b>, um sowohl mit alten (.NET Framework 4.7.2) als auch mit neuen<br> (.NET 6.0) Service-Versionen kompatibel zu sein.<br></p><br><h2>Voraussetzungen</h2><br><ul><br> <li><b>Entwicklungsumgebung:</b><br> <ul><br> <li>Visual Studio 2019 oder höher</li><br> <li>.NET Standard 2.0 als Zielplattform für PlugIns</li><br> </ul><br> </li><br> <li><b>Abhängigkeiten:</b><br> <ul><br> <li>OmniSeller.Common und OmniSeller.Enums aus dem HTK NuGet Repository: <code>https://htkpackages/repository/</code></li><br> </ul><br> </li><br> <li><b>Nützliche Schnittstellen und Modelle:</b><br> <ul><br> <li>IEntryPointPlugin (aus OmniSeller.Common)</li><br> <li>Enums.EntryPoint und Enums.ShopTypes</li><br> </ul><br> </li><br> <li><b>Zugriff auf ein bestehendes OmniSeller-System</b>, um das PlugIn zu testen</li><br></ul><br><h2>Struktur eines OmniSeller PlugIns</h2><br><p><br> Ein OmniSeller PlugIn muss die Schnittstelle <code>IEntryPointPlugin</code> implementieren, die folgende Eigenschaften und Methoden definiert:<br></p><br><pre><br>public interface IEntryPointPlugin<br>{<br> string Name { get; }<br> EntryPoint SupportedEntryPoints { get; }<br> string Version { get; }<br> int SortOrder { get; }<br> string Author { get; }<br> string Publisher { get; }<br> ShopTypes SupportedShopTypes { get; }<br> string Notes { get; }<br> Product Call(ShopTypes shopType, int portalID, Product productObj, EntryPoint entryPoint);<br>}<br></pre><br><h3>Beispiel für ein PlugIn: ZeroPricePlugIn</h3><br><p><br> Dieses PlugIn setzt automatisch den niedrigsten Preis für Produkte, die den Preis <code>0</code> haben, basierend auf den Preisen der Kind-Produkte.<br></p><br><pre><br>using OmniSeller.Enums;<br>using OmniSellerPlugins.Interfaces;<br>using OmniSellerPlugins.Models;<br>using System; | ||
OmniSeller PlugIns basieren auf | |||
Product Call(ShopTypes shopType, int portalID, Product productObj, EntryPoint entryPoint); | |||
namespace OmniSeller.PlugIns<br>{<br> internal class ZeroPricePlugIn : IEntryPointPlugin<br> {<br> public string Name => "OmniSellerZeroPricePlugIn";<br> public EntryPoint SupportedEntryPoints => EntryPoint.PRICE_BEFORE_UPLOAD;<br> public string Version => "1.0.0.0";<br> public int SortOrder => 1000;<br> public string Author => "AS";<br> public string Publisher => "HTK GmbH & Co.KG";<br> public ShopTypes SupportedShopTypes => ShopTypes.Magento;<br> public string Notes => "Kein Hinweistext"; | namespace OmniSeller.PlugIns<br>{<br> internal class ZeroPricePlugIn : IEntryPointPlugin<br> {<br> public string Name => "OmniSellerZeroPricePlugIn";<br> public EntryPoint SupportedEntryPoints => EntryPoint.PRICE_BEFORE_UPLOAD;<br> public string Version => "1.0.0.0";<br> public int SortOrder => 1000;<br> public string Author => "AS";<br> public string Publisher => "HTK GmbH & Co.KG";<br> public ShopTypes SupportedShopTypes => ShopTypes.Magento;<br> public string Notes => "Kein Hinweistext"; | ||
Zeile 21: | Zeile 5: | ||
public ZeroPricePlugIn()<br> {<br> Console.WriteLine($"Running PlugIn {Name}");<br> } | public ZeroPricePlugIn()<br> {<br> Console.WriteLine($"Running PlugIn {Name}");<br> } | ||
public Product Call(ShopTypes shopType, int portalID, Product productObj, EntryPoint entryPoint)<br> {<br> Console.WriteLine($"Running PlugIn {Name} for {shopType} at {entryPoint}");<br> if (shopType == ShopTypes.Magento)<br> {<br> // Logik zur Anpassung von Produktpreisen<br> }<br> return productObj;<br> }<br> }<br>}<br> | public Product Call(ShopTypes shopType, int portalID, Product productObj, EntryPoint entryPoint)<br> {<br> Console.WriteLine($"Running PlugIn {Name} for {shopType} at {entryPoint}");<br> if (shopType == ShopTypes.Magento)<br> {<br> // Logik zur Anpassung von Produktpreisen<br> }<br> return productObj;<br> }<br> }<br>}<br></pre><br><h2>Schritt-für-Schritt-Anleitung zur Erstellung eines PlugIns</h2><br><h3>1. Projekt einrichten</h3><br><ul><br> <li>Erstelle ein neues <b>.NET Standard 2.0</b> Class Library-Projekt in Visual Studio</li><br> <li>Füge die folgenden Pakete über das HTK NuGet Repository hinzu:</li><br> <pre><br>OmniSeller.Common<br>OmniSeller.Enums<br> </pre><br></ul><br><h3>2. PlugIn-Logik implementieren</h3><br><ul><br> <li>Implementiere die Schnittstelle <code>IEntryPointPlugin</code>.</li><br> <li>Definiere die unterstützten <code>EntryPoints</code> und <code>ShopTypes</code>.</li><br> <li>Implementiere die Logik in der Methode <code>Call</code>.</li><br></ul><br><h3>3. PlugIn erstellen und veröffentlichen</h3><br><ul><br> <li>Kompiliere das Projekt.</li><br> <li>Die resultierende <code>.dll</code>-Datei (zusammen mit ihren Abhängigkeiten) wird in das OmniSeller PlugIn-Verzeichnis kopiert:</li><br> <pre>C:\OmniVersum\Apps\OmniSellerService2\PlugIns</pre><br></ul><br><h3>4. PlugIn testen</h3><br><ul><br> <li>Starte den OmniSeller DataService und beobachte die Logs.</li><br> <li>Das PlugIn wird automatisch geladen und ausgeführt, wenn der entsprechende <code>EntryPoint</code> erreicht wird.</li><br></ul><br><h2>EntryPoints und deren Bedeutung</h2><br><table border="1"><br> <tr><br> <th>EntryPoint</th><br> <th>Beschreibung</th><br> </tr><br> <tr><br> <td>PORTAL_STARTUP</td><br> <td>Wird beim Start eines Portals ausgeführt.</td><br> </tr><br> <tr><br> <td>PRODUCT_BEFORE_UPLOAD</td><br> <td>Vor dem Produkt-Upload.</td><br> </tr><br> <tr><br> <td>PRODUCT_AFTER_UPLOAD</td><br> <td>Nach dem Produkt-Upload.</td><br> </tr><br> <tr><br> <td>PRICE_BEFORE_UPLOAD</td><br> <td>Vor dem Preis-Upload.</td><br> </tr><br> <tr><br> <td>PRICE_AFTER_UPLOAD</td><br> <td>Nach dem Preis-Upload.</td><br> </tr><br> <tr><br> <td>ORDER_AFTER_DOWNLOAD</td><br> <td>Nach dem Herunterladen einer Bestellung.</td><br> </tr><br></table><br><h2>Best Practices für PlugIns</h2><br><ul><br> <li><b>Vermeide lange Blockaden:</b><br> <ul><br> <li>Die Methode <code>Call</code> sollte möglichst schnell ausgeführt werden, um Verzögerungen im DataService zu vermeiden.</li><br> </ul><br> </li><br> <li><b>Fehlerbehandlung:</b><br> <ul><br> <li>Verwende <code>try-catch</code>, um Laufzeitfehler zu verhindern, die den gesamten Service beeinflussen könnten.</li><br> </ul><br> </li><br> <li><b>Testumgebung nutzen:</b><br> <ul><br> <li>Teste das PlugIn in einer Entwicklungs- oder Staging-Umgebung, bevor es in die Produktion übernommen wird.</li><br> </ul><br> </li><br> <li><b>Log-Ausgaben:</b><br> <ul><br> <li>Nutze <code>Console.WriteLine</code>, um wichtige Informationen und Debug-Daten während der PlugIn-Ausführung zu loggen.</li><br> </ul><br> </li><br></ul><br><h2>Beispielhafte Ordnerstruktur</h2><br><pre><br>C:\OmniVersum\Apps\OmniSellerService2\<br>├── PlugIns\<br>│ ├── OmniSellerZeroPricePlugIn.dll<br>│ ├── OmniSeller.Common.dll<br>│ ├── OmniSeller.Enums.dll<br>├── OmniSellerService.exe<br></pre><br><h2>Häufige Fehler und Lösungen</h2><br><ul><br> <li><b>PlugIn wird nicht geladen:</b><br> <ul><br> <li>Überprüfe, ob die <code>IEntryPointPlugin</code>-Schnittstelle korrekt implementiert wurde.</li><br> <li>Stelle sicher, dass alle Abhängigkeiten (z. B. <code>OmniSeller.Common</code>) verfügbar sind.</li><br> </ul><br> </li><br> <li><b>Assembly-Version inkompatibel:</b><br> <ul><br> <li>Stelle sicher, dass die Hauptanwendung und das PlugIn dieselben Versionen von <code>OmniSeller.Common</code> verwenden.</li><br> </ul><br> </li><br> <li><b>Kein <code>EntryPoint</code> aktiviert:</b><br> <ul><br> <li>Prüfe, ob der EntryPoint des PlugIns (<code>SupportedEntryPoints</code>) mit dem vom Service ausgelösten EntryPoint übereinstimmt.</li><br> </ul><br> </li><br></ul><br> | ||