Подтвердить что ты не робот

Должна ли служба WCF быть одиночной или нет?

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

4b9b3361

Ответ 1

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

Например, 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, "модель" НЕ ДЕЛАЕТ > соответствует проблеме. Это похоже на то, что вытащили стеклянную тапочку на ступню сестры! И никто никогда не должен этого видеть.


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

Ответ 2

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

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

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

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

Ответ 3

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

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