V dnešním článku se podíváme na možnosti ovlivnění vytváření instancí naší služby. Spravovat instance můžeme několika způsoby. Prvním způsobem je využití vlastnosti InstanceContextMode, který může nabývat těchto hodnot:

  • InstanceContextMode.PerCall
  • InstanceContextMode.PerSession (default)
  • InstanceContextMode.Single

Pokud nenastavíme žádný mód, defaultně je nastaveno PerSerssion, což zajistí, že je vytvořena pouze jedna instance, která existuje po celou dobu session. Pokud je nastaven mód PerCall, je vždy při zavolání jakékoliv operace vytvořena nová instance. V posledním případě, pokud nastavíme mód na Single, zajístíme vytvoření pouze jediné instance. Instance je vytvořena ve chvíli, kdy první klient pošle požadavek na naší službu.

Víme tedy co jednotlivé módy znamenají a nyní se podíváme jak jednotlivé módy nastavit

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class Service1 : IService1
{
}

Ve chvíli, kdy provádíme implementaci našeho ServiceContractu (rozhraní), označíme třídu atributem ServiceBehavior, ve kterém můžeme nastavit hodnotu InstanceContextMode na jednu z požadovaných hodnot.

Druhým způsobem jak manipulovat s instancemi, je využití atributu OperationBehavior a vlastnosti ReleaseInstanceMode. Tato vlastnost může nabývat opět několika hodnot:

  • ReleaseInstanceMode.AfterCall
  • ReleaseInstanceMode.BeforeAndAfterCall
  • ReleaseInstanceMode.BeforeCall
  • ReleaseInstanceMode.None

Co to přesně znamená? Pokud označíme implementaci naší metody tímto atributem a nastavíme ho např. na hodnotu AfterCall, stane se to, že po provedení operace dojde k uvolnění instance i v případě, že je nastaven InstanceContextMode.Single. Hodnota BeforeAndAfterCall provede uvolnění instance ještě před zavoláním metody a ihned po ukončení volání metody. BeforeCall je opak AfterCall, tedy dojde k uvolnění před zavoláním metody.

Jak nastavíme tento mód můžete vidět zde:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class Service1 : IService1
{       
    [OperationBehavior(ReleaseInstanceMode = ReleaseInstanceMode.AfterCall)]
    public void Zaplat()
    {
        foreach (var s in zbozi)
        {
            Console.WriteLine("  " + s);
        }
        Console.WriteLine("Zaplaceno");
    }
}

Jak jste mohli vidět, ovlivnění životnosti naší služba je jen otázkou jednoduchého nastavení patřičných atributů.