Образец имеет InstanceContextMode.PerSession
, а не InstanceContextMode.PerCall
. Каждый подписанный клиент связан с отдельным экземпляром MyService
. Каждый из этих экземпляров имеет поле члена _callbackInstance
, которое содержит ссылку на канал обратного вызова его конкретного клиента. Все экземпляры MyService
связаны со «комнатой чата» через статическое событие Broadcast
, и когда конкретный клиент что-то говорит, код выполняет итерацию по списку вызовов статического события для передачи каждому подписанному клиенту.
Если вы сделаете MyService
синглтоном, _callbackInstance
будет содержать только канал обратного вызова последнего подписанного клиента, поэтому вы видите описанное вами поведение.
Для того чтобы класс обслуживания работал правильно как одноэлементный экземпляр, вам необходимо заменить _callbackInstance
на коллекцию, содержащую все каналы обратного вызова для подписанных клиентов, и самостоятельно управлять добавлением и удалением из этой коллекции в качестве клиентов. прибыл и ушел. Вещание будет включать повторение этой коллекции. Недостаток этого подхода заключается в том, что несколько клиентов могут вызывать службу одновременно, и поэтому вам необходимо явно синхронизировать доступ к членам класса, чтобы обеспечить безопасность потоков и правильное поведение.