必要なものによって異なります。アプリケーションの存続期間中にサービスのインスタンスを 1 つだけインスタンス化する必要がある場合は、singleを使用することをお勧めします。たとえば、そのサービスのインスタンス化が何らかの理由で非常に高価であり、頻繁に呼び出されないため、複数のスレッドが同時にヒットすることを心配していない場合に、これを行うことができます。
[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>();
}
上記のコードでは、ConcurrentDictionary インスタンスに高価なオブジェクトを配置しているため、サービスのすべての呼び出し元に対して ConcurrentDictionary インスタンスを使用したいと考えています。
ユーザーが API とステートフルで長時間の会話を行うことを意図している場合は、 sessionを使用できます。
サービスがステートレスで、サービスのインスタンス化が低コストである場合は、呼び出しごとに使用できます。
それは本当にあなたが何をしたいかによって異なります。
ここにこれに関連する良い質問もあります。また、あなたが興味を持っているかもしれないスロットリングにも触れています:-
WCF ConcurrencyMode Single および InstanceContextMode PerCall