Utilizzando WCF in modo abbastanza spinto mi è capitato di dover sfruttare della memoria allocata in RAM cercando di annullare l'overhead del caricamento in RAM dei dati.
In questo caso mi è venuta in aiuto la classe ServiceBehaviour, in particolar modo decorando il mio servizio con l'attributo
[ServiceBehaviour(InstanceContextMode=InstanceContextMode.Single)] ho ottenuto il risultato desiderato, implementando il pattern Singleton.
Si devono fare alcune considerazioni su "InstanceContextMode.Single" , in primis per poterlo utilizzare in modo sensato è necessario un binding di tipo ws in quanto è necessario una comunicazione dual way tra service e chiamante, in particolar modo il nostro service necessita di riconoscere il chiamante, quindi scordiamoci (ma scordiamocelo anche in generale) di usare un binding di tipo basic.
Sono disponibili altri valori per l'enumeratore InstanceContextMode in particolare:
- InstanceContextMode.Single
- InstanceContextMode.PerSession
- InstanceContextMode.Per call
Se proprio volete usare un binding di tipo basic l'unico tipo di InstanceContextMode che ha senso è il PerCall.
E' facile intuire come nel caso del valore PerSession venga istanziata una classe del nostro servizio per ogni sessione
mentre nel caso del valore PerCall venga istanziata una classe del nostro servizio ad ogni chiamata.
(In realtà non è proprio così ma in soldoni succede questo...)
Quando impostate il valore dell' InstanceContextMode su Single fate molta attenzione poichè se non impostate il valore del parametro ConcurrencyMode su Multiple verrà processato un messaggio alla volta.
Alla prossima..