Мое веб-приложение ASP .Net C # позволяет пользователям отправлять файлы из своей учетной записи на моем сервере на любой удаленный сервер с использованием FTP. Я реализовал сервис WCF, чтобы сделать это. Служба создает экземпляр класса для каждого пользователя, который порождает рабочий поток, который выполняет операции FTP на сервере. Клиент отправляет команду службе, служба находит рабочий поток, назначенный клиенту, и запускает команды FTP. Затем клиент каждые две секунды опрашивает службу, чтобы получить статус операции FTP. Когда клиент отправляет команду «отключить», класс и рабочий поток, выполняющие операции FTP, уничтожаются.
Рабочий поток FTP должен сохраняться между запросами клиента, поскольку обработка FTP может занять много времени. Итак, мне нужен был способ, чтобы клиент всегда получал один и тот же экземпляр класса FTP между вызовами службы. Я реализовал этот сервис как синглтон, таким образом:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class UserFtpService : IUserFtpService
{
private SortedDictionary<string, UserFTPConnection> _clients = new SortedDictionary<string, UserFTPConnection>();
...
}
Где "UserFTPConnection" - это класс, содержащий рабочий поток, а имя учетной записи пользователя используется для индексации в словаре.
У меня такой вопрос: в книгах, которые я читал о WCF, экземпляр синглтона называется «врагом масштабируемости». И я понимаю, почему это так. Есть ли лучший способ убедиться, что клиент получает один и тот же экземпляр UserFTPConnection между запросами к службе WCF, кроме использования синглтона?