It depends on what you need. If you need a single instance of your service to be instantiated for the life time of the application you might want to use single. You might do this for instance if instantiating that service was extremely expensive for some reason and it was not called very often so you weren't concerned about multiple threads hitting it at the same time.
[ServiceBehavior(Namespace = "http://somenamespace", InstanceContextMode = InstanceContextMode.Single)]
public sealed class ServiceWithExpensiveDictionary : IServiceWithExpensiveDictionary, IDisposable
{
private DataCacheFactory factory;
private ConcurrentDictionary<string, DataCache> dataCacheDictionary;
/// <summary>
/// Constructor
/// </summary>
public ServiceWithExpensiveDictionary()
{
factory = new DataCacheFactory();
dataCacheDictionary = new ConcurrentDictionary<string,DataCache>();
}
In the code above, I want the ConcurrentDictionary instance to be around for all callers of the service as I'm putting expensive objects into it.
You might use session if you were intending users to have stateful long-running conversations with your api.
You might use per call if your services were stateless and service instantiation was cheap.
It really depends on what you want to do.
There is also a nice question related to this here. It also touches on throttling which you might also be interested in:-
WCF ConcurrencyMode Single and InstanceContextMode PerCall