Table des matières
Le module Comarch.POS.ExtensionPoints permet d’étendre à plusieurs reprises la même méthode de viewmodel. Il est ainsi possible de créer plusieurs extensions indépendantes qui modifient le fonctionnement de la même fonction native.
Architecture de branchements
Un viewmodel héritier supplémentaire, ainsi qu’un service métier lui dédié ont été créés pour le viewmodel étendu. Par exemple :
public class DocumentViewModelExtensionPoint : DocumentViewModel public class DocumentViewModelExtensionPointService : PrintingViewModelNavigationExtensionPointService<IDocumentViewModel>, IDocumentViewModelExtensionPointService IDocumentViewModelExtensionPointInternalService
Chaque méthode étendue de viewmodel possède deux événements « à brancher » dans le service : Before et After. Une exception sont les activateurs, c’est-à-dire les méthodes qui retournent le drapeau boolean. Un seul événement existe pour eux.
En élargissant une méthode particulière de viewmodel nous accédons aux paramètres de l’appel donné, ainsi qu’à l’instance du viewmodel donné. Le but est de partager le contexte entier de l’opération.
L’événement Before<nom_de_méthode> permet de signaler l’arrêt d’appel d’un appel standard. Il ne faut pas oublier qu’il est possible que dans un environnement avec plusieurs extensions, plusieurs extensions seront branchées à un seul événement. Chaque appel suivant sera basé sur les résultats de l’appel précédent. Il ne faut pas présumer qu’au début d’appel la valeur Cancel sera définie sur false. En outre, il faut présumer que l’ordre d’appel des extensions est non-déterministe.
Exemple :
[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) // gestion d'état d'origine return; // code }
Appeler une méthode native de ViewModel
Il peut arriver que l’on veuille, par extension, faire dépendre l’appel d’une opération native de la décision de l’opérateur. Les messages sur POS bloquent la gestion et son traitement peut être continué uniquement dans un handler de retour de la boîte de dialogue avec le message.
private void _documentViewModelExtensionPointService_BeforeProductAddEvent(object sender, EntityViewModelCancelEventArgs<IDocumentViewModel, LotRow> e) { e.Cancel = true; MonitService.ShowQuestion("Voulez-vous ajouter le produit ?", (s, m) => { if (m.MonitResult == MonitResult.Yes) { var serv = DocumentViewModelExtensionPointService. GetViewModelActions(e.ViewModel); serv.ProductAdd(e.EntityRow); } }); }
La méthode GetViewModelActions retourne les instances qui permettent d’appeler les méthodes natives du viewmodel de base en omettant l’extensibilité.
Branchements disponibles
En général, chaque extension de viewmodel permet de modifier les méthodes de navigation :
- OnActivated() – BeforeOnActivatedEvent, AfterOnActivatedEvent
- OnInitialization() – Before OnInitializationEvent, AfterOnInitializationEvent
- OnDeactivated() – BeforeOnDeactivatedEvent, AfterOnDeactivatedEvent
Viewmodels qui prennent en charge le processus d’impression ont de plus les extensions des méthodes :
- Print() – BeforePrintEvent, AfterPrintEvent
- CanPrint() – CanPrintEvent
Exemple d’implémentation
Ci-dessus, vous trouverez l’implémentation d’une extension finie qui fera afficher deux messages au moment d’enregistrement d’un document commercial – un message avant l’enregistrement et l’autre tout de suite après l’enregistrement.
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"); } }