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