U bevindt zich nu op een technische pagina over de software Mercator. Deze pagina bevat specifieke informatie die bestemd is voor professionals van de software Mercator. Wenst u naar algemenere informatie over Mercator door te gaan?


   Deze vraag niet meer stellen

10 aandachtspunten voor een geslaagde Mercator – ASP.NET integratie

0000002957     -      07-01-2020

We zetten hier enkele aandachtspunten op een rijtje om een ASP.net-ontwikkeling rond Mercator te optimaliseren, met ontwikkeltools van Mercator.

1.De Mercator-omgeving moet slechts één keer worden geïnstantieerd, wanneer de webapplicatie wordt opgestart. Dit neemt een beetje tijd in beslag (dezelfde tijd als het opstarten van de Mercator-toepassing op uw computer).

2. De meest efficiënte manier om de juiste prijzen te krijgen is door gebruik te maken van de BillingEngine. U voert een InsertItem uit met het gewenste artikel voor deze klant. Dan hoeft u alleen maar de gegevens van BillingEngine.LignesVRecords op te halen om de eenheidsprijs, de korting, ... te kennen. Als BillingEngine.LignesVRecords[...].PROMOSOLDE waar is, dan is dit artikel in promotie.

3.In het verlengde van het vorige punt, gebruik deze functie van de InsertItem. De laatste parameter ‘true’, zorgt ervoor dat de DataTable BillingEngine.STOCK niet wordt gevoed.

Zoom
billingEngine.InsertItem(drStock, billingEngine.LIGNES.Rows[nLigne], 1, true, true, true, true, true, true, true);

Indien u meer statische winkelmandjes gebruikt om de prijzen van uw site te berekenen, kan deze DataTable na verloop van tijd uw gehele artikeldatabase bevatten. Het geheugen dat door de webapplicatie gebruikt wordt, kan dan snel te groot worden.

 

4. Deze functie heeft ook het voordeel dat hij rechtstreeks een DataRow ontvangt die overeenkomt met het artikel (tabel STOCK). Dit maakt het mogelijk om de selectie van artikelinformatie te groeperen en niet voor elk artikel een verbinding met de SQL-server te maken. Maak dus gebruik van een enkele select ... from STOCK voor al deze artikelen uit de catalogus. Gebruik dan InsertItem voor elke DataRow van dit resultaat.

In plaats van een  select * from STOCK te maken, geeft u hier de voorkeur aan om de gegevens van de SQL-server niet te verzwaren:

Zoom
MercatorUi.Sig.Sig sigStock = MercatorUi.Sig._SigsStatic.SigByModule(MercatorUi.Sig._SigEnum.STOCK);
string reqSql = string.Format("select {0} from STOCK", sigStock.FieldsListForSelectRtrimNoBytes);

 

5.Houd er rekening mee dat een webapplicatie multi-threaded is. Een BillingEngine is echter niet threadsafe, omdat deze in essentie gebaseerd is op een DataSet. Dit betekent dat u er altijd op moet letten dat er slechts één thread per keer een BillingEngine kan wijzigen. Dit kan eenvoudig worden gedaan met deze code die automatisch een wachtrij creëert.

Zoom
lock (billingEngine)
{
    // ... verschillende wijzigingen op de BillingEngine
    billingEngine.UpdateAmounts();
}

 

6.Om het wachtrijaspect te optimaliseren kan het interessant zijn om met verschillende statische BillingEngines te werken en deze op hun beurt te gebruiken.

Zoom
private int indexForBillingEnginesForGetInfoArtAndNotLoggedCustomer = 0;
private int maxForBillingEnginesForGetInfoArtAndNotLoggedCustomer = 3;
internal MercatorUi.Engine.Gescom.BillingEngine[] billingEnginesForGetInfoArtAndNotLoggedCustomer = ... (créer ici 3 BillingEngines) ;
public MercatorUi.Engine.Gescom.BillingEngine BillingEngineForGetInfoArtAndNotLoggedCustomer
{
    get
    {
        MercatorUi.Engine.Gescom.BillingEngine ret = billingEnginesForGetInfoArtAndNotLoggedCustomer[indexForBillingEnginesForGetInfoArtAndNotLoggedCustomer];
        indexForBillingEnginesForGetInfoArtAndNotLoggedCustomer++;
        if (indexForBillingEnginesForGetInfoArtAndNotLoggedCustomer >= maxForBillingEnginesForGetInfoArtAndNotLoggedCustomer)
            indexForBillingEnginesForGetInfoArtAndNotLoggedCustomer = 0;
        if (ret.PiedsVRecord.DATE != DateTime.Today)
            ret.PiedsVRecord.DATE = DateTime.Today;
        return ret;
    }
}

 

7. Een ASP.net-toepassing kan op elk moment worden gerecycled. Een recyclage staat hier gelijk aan een Mercator-reboot. Als u de link naar de internetgebruikersmanden in dit formulier ,onderhoudt, moet u ervoor zorgen dat de BillingEngine die u wilt gebruiken nog steeds open is. Indien deze BillingEngine niet meer bestaat, zal deze via de BillingEngine.InitExisting methode opnieuw geopend moeten worden.

Zoom
bool isNew;
MercatorUi.Interfaces.IEngine engine;
MercatorUi.Engine.Gescom.BillingEngine billingEngine = null;
if ((HttpContext.Current.Session["CurrentEngineKey"] != null) && MercatorUi.Globals.EnginesUsedByExtApp.TryGetValue(HttpContext.Current.Session["CurrentEngineKey"].ToString(), out engine))
{
    billingEngine = (MercatorUi.Engine.Gescom.BillingEngine)engine;
    isNew = false;
}
else
{
    isNew = true;
    billingEngine = MercatorUi.Engine.Gescom.BillingEngine.InitExisting(MercatorUi.Engine.Gescom.Billing.TypeVAEnum.V, 4, Id, Journal, Piece);
    if ((billingEngine.DataSet != null) && (!billingEngine.ReadOnly))
    {
        billingEngine.PiedsVRecord.DATE = DateTime.Today;
        HttpContext.Current.Session["CurrentEngineKey"] = billingEngine.UniqueIdForExtApp;
    }
    else
        billingEngine = null;
}

 

8.Waarschijnlijk slaat u de referenties van een mandje (id, logboek, stuk) op in een cookie zodat de gebruiker, wanneer hij terugkomt op de site, deze opnieuw kan gebruiken. Als dit mandje nog niet geopend is in de website, dan kan dat eenvoudig met de BillingEngine.InitExisting methode. Het is echter noodzakelijk om de ReadOnly eigenschap van deze BillingEngine te testen. Dit document kan inderdaad worden gewijzigd door een Mercator-gebruiker. In dit geval zal het niet mogelijk zijn om de internetgebruiker zijn of haar winkelwagen te laten aanpassen.

 

9. Sla de toegang tot de SQL server op en cache items die vaak identiek worden berekend. Bijvoorbeeld de inhoud van uw homepage, die weinig varieert en zeer vaak gevraagd wordt. Deze caching verkleint de TTF van uw pagina (Time to First Byte) omdat er meerdere verbindingen met de SQL-server zijn opgeslagen. Gebruik hiervoor een collectie die ook thread-safe is. Bijvoorbeeld, een ConcurrentDictionary :

Zoom
private static System.Collections.Concurrent.ConcurrentDictionary<string, CacheHolder> dicoCache = new System.Collections.Concurrent.ConcurrentDictionary<string, CacheHolder>();

Zoom
if (dicoCache.ContainsKey(MasterPage.Langue) && dicoCache.TryGetValue(MasterPage.Langue, out cacheHolder))
{
    cacheHolder.listCacheVuePar.Add(sessionId);
    return cacheHolder.cache;
}

Zoom
var newCacheHolder = new CacheHolder(ret);
dicoCache.AddOrUpdate(MasterPage.Langue, newCacheHolder, (k, v) => newCacheHolder);

 

10. Om goed te kunnen functioneren, verwacht Mercator de volgende Culture parameters:

  • decimaal scheidingsteken: altijd een punt
  • Duizend scheidingsteken: altijd spatie

Dit kan worden gewaarborgd door een code als deze:

Zoom
public void ChangeCulture(string langue)
{
    CultureInfo ret;
    switch (langue)
    {
        case "N":
            ret = new CultureInfo("nl-NL");
            break;
        case "E":
            ret = new CultureInfo("en-US");
            break;
        case "D":
            ret = new CultureInfo("de-DE");
            break;
        default:
            ret = new CultureInfo("fr-FR");
            break;
    }
    if (ret.NumberFormat.NumberDecimalSeparator != ".")
        ret.NumberFormat.NumberDecimalSeparator = ".";
    if (ret.NumberFormat.NumberGroupSeparator != " ")
        ret.NumberFormat.NumberGroupSeparator = " ";

    System.Threading.Thread.CurrentThread.CurrentUICulture = ret;
    System.Threading.Thread.CurrentThread.CurrentCulture = ret;
}