POS extension points

Mit dem Comarch.POS.ExtensionPoints-Modul können Sie dieselbe Methode des ViewModels mehrmals erweitern. So können mehrere unabhängige Erweiterungen erstellt werden, die die Funktionsweise der gleichen systemeigenen Funktion ändern.

Architektur der pin-points

Für das erweiterte Viewmodel wurde ein zusätzliches vererbendes Viewmodel erstellt, für das ein spezieller Business Service erstellt wurde. Beispiel:

public class DocumentViewModelExtensionPoint : DocumentViewModel
public class DocumentViewModelExtensionPointService : 
  PrintingViewModelNavigationExtensionPointService<IDocumentViewModel>,
  IDocumentViewModelExtensionPointService
  IDocumentViewModelExtensionPointInternalService

Jede erweiterbare ViewModel-Methode hat zwei Events im Service „einzuschließen“: Before und After. Die Ausnahme sind die Aktivatoren, also Methoden, die das Boolean Frag zurückgeben. Es gibt nur ein Event für sie.

Wenn Sie eine bestimmte Viewmodel-Methode erweitern, erhalten Sie Zugriff sowohl auf die Parameter des jeweiligen Aufrufs, als auch auf Instanzen des jeweiligen Viewmodels. Das Ziel ist, den vollständigen Kontext der Prozedur zur Verfügung zu stellen.

!!!Vorsicht!!!

Das Event Before<Name_der_Methode> ermöglicht die Signalisierung des Abbruchs eines Standardaufrufs. Es ist zu beachten, dass in der Umgebung mit mehreren Erweiterungen mit dem gleichen Event mehreren Erweiterungen zugeordnet werden kann. Jeder nachfolgende Aufruf basiert auf dem Ergebnis des vorangegangenen Aufrufs. Es kann nicht vorausgesetzt werden, dass zu Beginn des Aufrufs der Wert Cancel auf false gesetzt wird. Zusätzlich kann nicht vorausgesetzt werden, dass die Reihenfolge des Aufrufs der Erweiterungen nicht deterministisch ist.

Beispiel:

[Dependency]
public IPaymentViewModelExtensionPointService PaymentViewModelExtensionPointService
{ get; set; }

public override void Initialize()
{
   PaymentViewModelExtensionPointService.BeforeAddToPaymentFormEvent +=
_paymentViewModelExtensionPointService_BeforeAddToPaymentFormEvent;
}

private void _paymentViewModelExtensionPointService_BeforeAddToPaymentFormEvent(object sender, EntityViewModelCancelEventArgs<IPaymentViewModel, PaymentFormRow> e)
{
            if (e.Cancel) // Eingangsstatus behandeln
                return;

            // Code
        }

Systemeigene Methode des ViewModels aufrufen

Es kann vorkommen, dass Sie im Rahmen einer Erweiterung den Aufruf eines systemeigenen Vorgangs von der Entscheidung des Betreibers abhängig machen wollen. Meldungen im POS blockieren die Anwendung nicht, sodass die Handhabung nur im Rückhandler des Meldungsfensters fortgesetzt werden kann.

private void _documentViewModelExtensionPointService_BeforeProductAddEvent(object sender, EntityViewModelCancelEventArgs<IDocumentViewModel, LotRow> e) {

   e.Cancel = true;

   MonitService.ShowQuestion(„Möchten Sie die Ware hinzufügen?", (s, m) => {
       if (m.MonitResult == MonitResult.Yes) {
           var serv = DocumentViewModelExtensionPointService.
GetViewModelActions(e.ViewModel);
           serv.ProductAdd(e.EntityRow);
       }
   });
}

Die GetViewModelActions-Methode gibt uns eine Instanz zurück, die es uns ermöglicht, die systemeigenen Methoden des zugrunde liegenden ViewModels ohne die Erweiterbarkeit aufzurufen.

Verfügbare POS extension points

Standardmäßig ermöglicht jede Erweiterung des ViewModels die Modifizierung von volgenden Navigationsmethoden:

  • OnActivated() – BeforeOnActivatedEvent, AfterOnActivatedEvent
  • OnInitialization() – Before OnInitializationEvent, AfterOnInitializationEvent
  • OnDeactivated() – BeforeOnDeactivatedEvent, AfterOnDeactivatedEvent

Viewmodels, die den Druckprozess unterstützen, haben zusätzliche Erweiterungen der Methoden:

  • Print() – BeforePrintEvent, AfterPrintEvent
  • CanPrint() – CanPrintEvent

Beispiel für Implementierung

Im Folgenden wird eine fertige Erweiterung implementiert, die zwei Meldungen anzeigt, wenn ein Handelsdokument gespeichert wird, eine vor und eine unmittelbar nach dem Speichern.

using Microsoft.Practices.Unity;
using Comarch.POS.ExtensionPoints.Presentation.Sales.ViewModels;
using Comarch.POS.Presentation.Core.Services;
using Comarch.POS.Presentation.Core;

public class Module : ModuleBase
{
   private readonly IUnityContainer _container;
        
   [Dependency]
   public IMonitService MonitService { get; set; }

   [Dependency]
   public IDocumentViewModelExtensionPointService DocumentViewModelExtensionPointService { get; set; }
   public Module(IUnityContainer container) : base(container)
   {
      _container = container;
   }

   public override void Initialize()
   {
      DocumentViewModelExtensionPointService.BeforeSaveEvent += _documentViewModelExtensionPointService_BeforeSaveEvent;
      DocumentViewModelExtensionPointService.AfterSaveEvent += _documentViewModelExtensionPointService_AfterSaveEvent;
   }

   private void _documentViewModelExtensionPointService_AfterSaveEvent(object sender, GenerateViewModelEventArgs<IDocumentViewModel> e) {
      MonitService.ShowInformation("Extension: after save");
   } 

   private void _documentViewModelExtensionPointService_BeforeSaveEvent(object sender, GenerateEntityViewModelCancelEventArgs<IDocumentViewModel> e) {
      if (e.Cancel)
         return;

      MonitService.ShowInformation("Extension: before save");
   }  
}

 

Czy ten artykuł był pomocny?