Вы правы. SingleCall создает объект для каждого вызова и может принимать несколько одновременных запросов, но данные не могут быть разделены между вызовами, в то время как Singleton создает один объект для обработки нескольких вызовов, позволяя обмениваться данными, но ограничивает одновременные соединения. Однако есть некоторые хитрости, которые вы можете сделать, если у вас есть представление о том, как создавать поточно-ориентированные объекты.
Во-первых, я бы предложил использовать Синглтон, так как он создается только один раз для многих. Это также имеет то преимущество, что вы можете хранить информацию и обмениваться ею между пользователями, подключающимися к ней, без необходимости постоянно посещать внешний магазин.
Во-вторых, я хотел бы изучить добавление ConcurrencyMode = ConcurrencyMode.Multiple к поведению ServiceBehaviors вашего сервиса. Это позволяет нескольким пользователям одновременно поразить ваш синглтон.
[ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.Single)]
public class CalculatorService : ICalculatorConcurrency
{
…
}
В-третьих, очистите любой код, который сделает этот класс не безопасным для потоков. Вы должны заблокировать объект при доступе к локальным переменным, к которым одновременно могут обращаться несколько потоков.
Много полезной информации по этим темам можно найти здесь:
http://msdn.microsoft.com/en-us/library/ms731193.aspx