Служба WCF должна быть одноразовой или нет? - PullRequest
21 голосов
/ 18 ноября 2009

Я полагаю, что Джимми Ниллсон сказал, что он обычно делает свои веб-сервисы одиночными. Это предпочтительный метод и с WCF? Кроме того, чтобы сделать сервисные методы статичными, есть ли что-то еще, что нужно сделать?

Ответы [ 3 ]

24 голосов
/ 18 ноября 2009

хорошие ответы, но я думаю, что есть проблема в оригинальном вопросе. «Типичное использование» технологии - плохо сформулированный вопрос. Ни у кого нет «типичного» сценария, и вам следует пересмотреть требования вашей конкретной проблемы, прежде чем принимать решение о реализации или подходе. Ваши требования должны сообщить ваше решение.

Например, Singletons [то есть шаблон Singleton] - это просто еще один инструмент в нашей коробке, и, как и любой инструмент, есть случаи, когда он работает, а другие - нет. В частности, если вам нужно централизовать бизнес-логику [более применимую в автономном приложении, чем удаленная служба WCF], или совместно использовать память или ресурс, Singleton работает хорошо. Конечно, если вы делитесь бизнес-логикой, состояние поддерживается в стеке вызовов, а многопоточность спорна. Если совместное использование памяти между вызовами потребителя, то многопоточность является проблемой. Что касается WCF, существует два режима (на самом деле три, но третий является частным случаем первого) поведения многопоточности, которое вы можете указать,

// we are specifying that this service implementation is single-threaded
// and WCF should permit *at most* one call at a time. Any requests made
// simultaneously/concurrently are queued.
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single)]
public class SingleThreadedNonThreadSafeService : IService { ... }

и

// we are specifying that this service implementation is multi-threaded
// and [hopefully!] thread-safe. WCF should permit any number of threads,
// or any number of simultaneous concurrent calls.
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]
public class MultiThreadedThreadSafeService : IService { ... }

XML-комментарии для ConcurrencyMode в основном говорят то же самое, что и выше.

Если вам НЕ не нужно делиться бизнес-логикой или памятью между потребителями, то НЕ использует Singleton, "модель" НЕ подходит проблема. Это все равно, что надевать мачеху на ногу сводной сестры! И никто никогда не должен видеть это.


И наоборот, если между вызовами нет общего состояния, разместите экземпляр для вызова \ сеанса.

19 голосов
/ 18 ноября 2009

Обычно НЕ . Синглеты - это беспорядок, так как для того, чтобы они работали хорошо, вам нужно сделать их многопоточными, и это просто создает проблемы, если вы действительно не знаете, что делаете.

Лучшей практикой для WCF является использование инстанцирования для каждого вызова - каждый запрос получает свою собственную копию класса обслуживания, нет проблем с многопоточностью, хорошая производительность - храните все, что нужно сохранить в базе данных - работает как чудо .

Единственный реальный сценарий, в котором синглтон может иметь смысл, - это если вам нужно, чтобы все запросы на обслуживание использовались / обрабатывались физическим ресурсом, доступным только в одном экземпляре - если ваша синглтон-служба сериализуется и, таким образом, защищает один ресурс, имеет смысл использовать его.

В противном случае - избавь себя от хлопот! : -)

8 голосов
/ 18 ноября 2009

Синглтон-сервисы WCF вряд ли когда-либо будут использоваться - синглтоны - враг масштабируемости! Они имеют смысл только в странных сценариях - запись в один файл, один коммуникационный порт или аппаратное устройство.

Как говорит Марк, лучший выбор для масштабируемости с WCF - это сервисы на основе вызовов (они предлагают лучший компромисс между производительностью и масштабируемостью). Услуги по вызову также очень хорошо работают с балансировкой нагрузки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...