Нет больше потенциала, чем компонент SingleCall. У обоих проблем будут проблемы, если они попытаются получить доступ к ячейке разделяемой памяти небезопасным образом.
Разница между SingleCall и Singleton заключается в том, что для SingleCall каждый входящий запрос получит новый экземпляр определенного типа, созданного для обработки этого вызова. Каждый экземпляр будет иметь собственное пространство памяти и переменные экземпляра, но они все равно могут совместно использовать статические и глобальные переменные, внешние ресурсы, файлы, сетевые подключения и т. Д. Если класс SingleCall кодируется для доступа к любому состоянию разделяемой памяти небезопасным образом , то у вас будут проблемы.
С другой стороны, Singleton получает только один экземпляр, созданный для ВСЕХ входящих запросов, поэтому по определению каждая переменная экземпляра, используемая внутри этого одноэлементного, фактически распределяется между всеми входящими запросами. Хорошим примером может быть издатель сообщений, чтобы весь код на сервере нуждался в доступе для отправки сообщений одному или нескольким подписанным клиентам.
Чтобы ответить на комментарий от @Cocowalla, убедитесь, что вы делаете это, вы переопределяете метод
MarshalByRefObject.InitializeLifetimeService()
, как показано на рисунке, или ваш одноточечно вымрет неожиданно, если никто не называет его на некоторое время ...
public class MessageManager : MarshalByRefObject
{
#region Singleton/MarshalByRefObject code
private static MessageManager mgr =
new MessageManager(); // creates singleton
static MessageManager() { }
private MessageManager() { }
public static MessageManager Instance { get { return mgr; } }
public override object InitializeLifetimeService() { return (null); }
#endregion Singlelton code
// ... other stuff ...
}
// in Remoting Host initialization code...
MessageManager mgr = MessageManager.Instance; // generates singleton;
RemotingServices.Marshal(mgr, URI);
«нет замков или других положений для защиты своего внутреннего состояния» ... вы уверены, что это Синглтон? Я понимаю, что вам нужно иметь блокировку для ограничения (начальной) конструкции для одного потока. –