在他的"编程WCF服务"一书中,Juval Lowry表达了对使用Singleton Services的担忧,因为它具有性能影响.
在我的一个项目中,我正在使用像这样声明的无状态单例WCF服务:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,
ConcurrencyMode = ConcurrencyMode.Multiple)]
public class FooService : IFoo
{
}
Run Code Online (Sandbox Code Playgroud)
通过httpsTransport从多个Silverlight客户端访问该服务.我选择了单例,因为我认为没有必要在不需要时为系统增加GC开销.我是否遗漏了某些内容,或者这不应该是实现无状态服务的最有效方式,如果不比PerCall实例化服务更快,它同样快速?
你没有遗漏任何东西.如果您的服务类没有实例成员变量,这些变量代表的状态显然可能被多线程访问损坏,那么没有什么可担心的.
我个人总是使用Single + Mulitple模式,因为我的所有状态总是来自缓存或SQL数据库或其他一些共享资源,你需要模式来防止并发.我从未发现我的服务中需要成员变量.静?当然也许,但是你知道无论如何要保护他们.
现在这是我对PerCall vs. Single的个人看法.另一方面,PerSession服务可能/很可能在实例中维护状态,但我个人并没有发现自己编写了很多这些服务,并且在极少数情况下,它们仍然是ConcurrencyMode.Single.
查看此MSDN文章,了解有关diff的更多讨论和实际性能比较.模式.