OmniSeller:PlugIn Entwicklung: Unterschied zwischen den Versionen

Zur Navigation springen Zur Suche springen
keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
Zeile 1: Zeile 1:
<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 =
<br>= OmniSeller PlugIn Entwicklung =


== Überblick ==
== Überblick ==<br>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 ==
== Voraussetzungen ==<br># '''Entwicklungsumgebung''':<br>#* Visual Studio 2019 oder höher.<br>#* .NET Standard 2.0 als Zielplattform für PlugIns.<br># '''Abhängigkeiten''':<br>#* `OmniSeller.Common` und `OmniSeller.Enums` aus dem **HTK NuGet Repository**:<br># ```plaintext<br># https://htkpackages/repository/<br># ```<br># '''Nützliche Schnittstellen und Modelle''':<br>#* `IEntryPointPlugin` (aus `OmniSeller.Common`).<br>#* `Enums.EntryPoint` und `Enums.ShopTypes`.<br># '''Zugriff auf ein bestehendes OmniSeller-System''', um das PlugIn zu testen.
# '''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**:
# ```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 ==<br>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<br>public interface IEntryPointPlugin<br>{<br>&nbsp; &nbsp; string Name { get; } // Der Name des PlugIns<br>&nbsp; &nbsp; EntryPoint SupportedEntryPoints { get; } // Unterstützte EntryPoints<br>&nbsp; &nbsp; string Version { get; } // Version des PlugIns<br>&nbsp; &nbsp; int SortOrder { get; } // Reihenfolge des PlugIns<br>&nbsp; &nbsp; string Author { get; } // Entwicklername<br>&nbsp; &nbsp; string Publisher { get; } // Herausgebername<br>&nbsp; &nbsp; ShopTypes SupportedShopTypes { get; } // Unterstützte Shop-Typen<br>&nbsp; &nbsp; string Notes { get; } // Notizen/Hinweise
public interface IEntryPointPlugin
{
    string Name { get; } // Der Name des PlugIns
    EntryPoint SupportedEntryPoints { get; } // Unterstützte EntryPoints
    string Version { get; } // Version des PlugIns
    int SortOrder { get; } // Reihenfolge des PlugIns
    string Author { get; } // Entwicklername
    string Publisher { get; } // Herausgebername
    ShopTypes SupportedShopTypes { get; } // Unterstützte Shop-Typen
    string Notes { get; } // Notizen/Hinweise


    Product Call(ShopTypes shopType, int portalID, Product productObj, EntryPoint entryPoint); // Hauptlogik
&nbsp; &nbsp; Product Call(ShopTypes shopType, int portalID, Product productObj, EntryPoint entryPoint); // Hauptlogik<br>}<br>```
}
</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;
<span class="hljs-keyword">using</span> OmniSellerPlugins.Interfaces;
<span class="hljs-keyword">using</span> OmniSellerPlugins.Models;
<span class="hljs-keyword">using</span> System;


<span class="hljs-keyword">namespace</span> <span class="hljs-title">OmniSeller.PlugIns</span>
=== Beispiel für ein PlugIn: ZeroPricePlugIn ===<br>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">internal</span> <span class="hljs-keyword">class</span> <span class="hljs-title">ZeroPricePlugIn</span> : <span class="hljs-title">IEntryPointPlugin</span>
    {
        <span class="hljs-keyword">public</span> <span class="hljs-built_in">string</span> Name =&gt; <span class="hljs-string">"OmniSellerZeroPricePlugIn"</span>;
        <span class="hljs-keyword">public</span> EntryPoint SupportedEntryPoints =&gt; EntryPoint.PRICE_BEFORE_UPLOAD;
        <span class="hljs-keyword">public</span> <span class="hljs-built_in">string</span> Version =&gt; <span class="hljs-string">"1.0.0.0"</span>;
        <span class="hljs-keyword">public</span> <span class="hljs-built_in">int</span> SortOrder =&gt; <span class="hljs-number">1000</span>;
        <span class="hljs-keyword">public</span> <span class="hljs-built_in">string</span> Author =&gt; <span class="hljs-string">"AS"</span>;
        <span class="hljs-keyword">public</span> <span class="hljs-built_in">string</span> Publisher =&gt; <span class="hljs-string">"HTK GmbH & Co.KG"</span>;
        <span class="hljs-keyword">public</span> ShopTypes SupportedShopTypes =&gt; ShopTypes.Magento;
        <span class="hljs-keyword">public</span> <span class="hljs-built_in">string</span> Notes =&gt; <span class="hljs-string">"Kein Hinweistext"</span>;


        <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-title">ZeroPricePlugIn</span>()</span>
```csharp<br>using OmniSeller.Enums;<br>using OmniSellerPlugins.Interfaces;<br>using OmniSellerPlugins.Models;<br>using System;
        {
            Console.WriteLine(<span class="hljs-string">$"Running PlugIn <span class="hljs-subst">{Name}</span>"</span>);
        }


        <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>
namespace OmniSeller.PlugIns<br>{<br>&nbsp; &nbsp; internal class ZeroPricePlugIn : IEntryPointPlugin<br>&nbsp; &nbsp; {<br>&nbsp; &nbsp; &nbsp; &nbsp; public string Name =&gt; "OmniSellerZeroPricePlugIn";<br>&nbsp; &nbsp; &nbsp; &nbsp; public EntryPoint SupportedEntryPoints =&gt; EntryPoint.PRICE_BEFORE_UPLOAD;<br>&nbsp; &nbsp; &nbsp; &nbsp; public string Version =&gt; "1.0.0.0";<br>&nbsp; &nbsp; &nbsp; &nbsp; public int SortOrder =&gt; 1000;<br>&nbsp; &nbsp; &nbsp; &nbsp; public string Author =&gt; "AS";<br>&nbsp; &nbsp; &nbsp; &nbsp; public string Publisher =&gt; "HTK GmbH & Co.KG";<br>&nbsp; &nbsp; &nbsp; &nbsp; public ShopTypes SupportedShopTypes =&gt; ShopTypes.Magento;<br>&nbsp; &nbsp; &nbsp; &nbsp; public string Notes =&gt; "Kein Hinweistext";
        {
 
            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>);
&nbsp; &nbsp; &nbsp; &nbsp; public ZeroPricePlugIn()<br>&nbsp; &nbsp; &nbsp; &nbsp; {<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine($"Running PlugIn {Name}");<br>&nbsp; &nbsp; &nbsp; &nbsp; }
            <span class="hljs-keyword">if</span> (shopType == ShopTypes.Magento)
 
            {
&nbsp; &nbsp; &nbsp; &nbsp; public Product Call(ShopTypes shopType, int portalID, Product productObj, EntryPoint entryPoint)<br>&nbsp; &nbsp; &nbsp; &nbsp; {<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine($"Running PlugIn {Name} for {shopType} at {entryPoint}");<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (shopType == ShopTypes.Magento)<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Logik zur Anpassung von Produktpreisen<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return productObj;<br>&nbsp; &nbsp; &nbsp; &nbsp; }<br>&nbsp; &nbsp; }<br>}<br>```
                <span class="hljs-comment">// Logik zur Anpassung von Produktpreisen</span>
 
            }
== Schritt-für-Schritt-Anleitung zur Erstellung eines PlugIns ==<br>=== 1. Projekt einrichten ===<br>* Erstelle ein neues '''.NET Standard 2.0''' Class Library-Projekt in Visual Studio.<br>* Füge die folgenden Pakete über das HTK NuGet Repository hinzu:<br>```plaintext<br>OmniSeller.Common<br>OmniSeller.Enums<br>```
            <span class="hljs-keyword">return</span> productObj;
 
        }
=== 2. PlugIn-Logik implementieren ===<br>* Implementiere die Schnittstelle `IEntryPointPlugin`.<br>* Definiere die unterstützten `EntryPoints` und `ShopTypes`.<br>* Implementiere die Logik in der Methode `Call`.
    }
 
}
=== 3. PlugIn erstellen und veröffentlichen ===<br>* Kompiliere das Projekt.<br>* Die resultierende `.dll`-Datei (zusammen mit ihren Abhängigkeiten) wird in das OmniSeller PlugIn-Verzeichnis kopiert:<br>```plaintext<br>C:\OmniVersum\Apps\OmniSellerService2\PlugIns<br>```
</code></div></div><p>== Schritt-für-Schritt-Anleitung zur Erstellung eines PlugIns == === 1. Projekt einrichten ===</p>
 
*Erstelle ein neues '''.NET Standard 2.0''' Class Library-Projekt in Visual Studio.
=== 4. PlugIn testen ===<br>* Starte den OmniSeller DataService und beobachte die Logs.<br>* Das PlugIn wird automatisch geladen und ausgeführt, wenn der entsprechende `EntryPoint` erreicht wird.
*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
== EntryPoints und deren Bedeutung ==<br>{| class="wikitable"<br>|-<br>! EntryPoint<br>! Beschreibung<br>|-<br>| `PORTAL_STARTUP`<br>| Wird beim Start eines Portals ausgeführt.<br>|-<br>| `PRODUCT_BEFORE_UPLOAD`<br>| Vor dem Produkt-Upload.<br>|-<br>| `PRODUCT_AFTER_UPLOAD`<br>| Nach dem Produkt-Upload.<br>|-<br>| `PRICE_BEFORE_UPLOAD`<br>| Vor dem Preis-Upload.<br>|-<br>| `PRICE_AFTER_UPLOAD`<br>| Nach dem Preis-Upload.<br>|-<br>| `ORDER_AFTER_DOWNLOAD`<br>| Nach dem Herunterladen einer Bestellung.<br>|}
OmniSeller.Enums
 
</code></div></div><p>=== 2. PlugIn-Logik implementieren ===</p>
== Best Practices für PlugIns ==<br># '''Vermeide lange Blockaden''':<br>#* Die Methode `Call` sollte möglichst schnell ausgeführt werden, um Verzögerungen im DataService zu vermeiden.<br># '''Fehlerbehandlung''':<br>#* Verwende `try-catch`, um Laufzeitfehler zu verhindern, die den gesamten Service beeinflussen könnten.<br># '''Testumgebung nutzen''':<br>#* Teste das PlugIn in einer Entwicklungs- oder Staging-Umgebung, bevor es in die Produktion übernommen wird.<br># '''Log-Ausgaben''':<br>#* Nutze `Console.WriteLine`, um wichtige Informationen und Debug-Daten während der PlugIn-Ausführung zu loggen.
*Implementiere die Schnittstelle <code>IEntryPointPlugin</code>.
 
*Definiere die unterstützten <code>EntryPoints</code> und <code>ShopTypes</code>.
== Beispielhafte Ordnerstruktur ==<br>```plaintext<br>C:\OmniVersum\Apps\OmniSellerService2\<br>├── PlugIns\<br>&nbsp; ├── OmniSellerZeroPricePlugIn.dll<br>&nbsp; ├── OmniSeller.Common.dll<br>&nbsp; ├── OmniSeller.Enums.dll<br>├── OmniSellerService.exe<br>```
*Implementiere die Logik in der Methode <code>Call</code>.
 
<p>=== 3. PlugIn erstellen und veröffentlichen ===</p>
== Häufige Fehler und Lösungen ==<br># '''PlugIn wird nicht geladen''':<br>#* Überprüfe, ob die `IEntryPointPlugin`-Schnittstelle korrekt implementiert wurde.<br>#* Stelle sicher, dass alle Abhängigkeiten (z. B. `OmniSeller.Common`) verfügbar sind.<br># '''Assembly-Version inkompatibel''':<br>#* Stelle sicher, dass die Hauptanwendung und das PlugIn dieselben Versionen von `OmniSeller.Common` und `OmniSeller.Enums` verwenden.<br># '''Kein `EntryPoint` aktiviert''':<br>#* Prüfe, ob der EntryPoint des PlugIns (`SupportedEntryPoints`) mit dem vom Service ausgelösten EntryPoint übereinstimmt.
*Kompiliere das Projekt.
 
*Die resultierende <code>.dll</code>-Datei (zusammen mit ihren Abhängigkeiten) wird in das OmniSeller PlugIn-Verzeichnis kopiert:
Falls es weitere Fragen oder Probleme gibt, wende dich an das '''OmniSeller-Entwicklungsteam'''.<br>
<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></div></div><p>=== 4. PlugIn testen ===</p>
*Starte den OmniSeller DataService und beobachte die Logs.
*Das PlugIn wird automatisch geladen und ausgeführt, wenn der entsprechende <code>EntryPoint</code> erreicht wird.
<p>== EntryPoints und deren Bedeutung == {| class="wikitable" |- ! EntryPoint</p>
{|<thead>
|-
! ! Beschreibung</thead>
|-
| <code>PORTAL_STARTUP</code>
|-
| Wird beim Start eines Portals ausgeführt.
|-
| -
|-
| <code>PRODUCT_BEFORE_UPLOAD</code>
|-
| Vor dem Produkt-Upload.
|-
| -
|-
| <code>PRODUCT_AFTER_UPLOAD</code>
|-
| Nach dem Produkt-Upload.
|-
| -
|-
| <code>PRICE_BEFORE_UPLOAD</code>
|-
| Vor dem Preis-Upload.
|-
| -
|-
| <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\
  ├── OmniSellerZeroPricePlugIn.dll
  ├── OmniSeller.Common.dll
  ├── OmniSeller.Enums.dll
├── OmniSellerService.exe
</code></div></div><p>== Häufige Fehler und Lösungen ==</p>
= '''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>
= '''Assembly-Version inkompatibel''': =
<p>#* Stelle sicher, dass die Hauptanwendung und das PlugIn dieselben Versionen von <code>OmniSeller.Common</code> und <code>OmniSeller.Enums</code> verwenden.</p>
= '''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>
1.381

Bearbeitungen

Navigationsmenü