我相信 Jimmy Nillson 说过他通常将他的网络服务做成单例。这是首选方法吗,并且使用 WCF?除了使服务方法静态之外,还有其他事情要做吗?
最佳答案
很好的回答,但我认为原始问题有问题。一项技术的“典型使用”是一个结构不佳的问题。没有人有“典型”场景,您应该在决定实现或方法之前查看特定问题的要求。您的要求应告知您的解决方案。
例如,Singletons [即Singleton 模式] 只是我们盒子里的另一个工具,和任何工具一样,在某些情况下它可以工作,而其他人则不能。具体来说,如果您需要集中业务逻辑[在独立应用程序中比远程 WCF 服务更适用],或者共享内存或资源,单例可以很好地工作。当然,如果是共享业务逻辑,状态是在调用栈中维护的,多线程是没有意义的。如果在消费者调用之间共享内存,那么多线程就是一个问题。至于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 { ... }
ConcurrencyMode
的 Xml 注释基本上和上面说的一样。如果您 不要需要在消费者之间共享业务逻辑或内存,那么不要使用单例,“模型”不适合问题。这就像在继姐妹的脚上强行穿玻璃鞋!没有人应该看到这一点。
相反,如果调用之间没有共享状态,则为每个调用\ session 托管一个实例。
关于wcf - WCF 服务通常是否应该是单例的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1756487/