WCF服务通常是单身还是不单身?

时间:2009-11-18 14:42:55

标签: wcf singleton

我相信Jimmy Nillson说他一般都是自己的网络服务单身人士。这是首选方法,还是使用WCF?除了使服务方法保持静态之外,还有其他事情要做吗?

3 个答案:

答案 0 :(得分:24)

回复良好,但我认为原始问题存在问题。技术的“典型用途”是一个形成不良的问题。没有人有“典型”场景,您应该在决定实施或方法之前查看特定问题的要求。您的要求应告知您的解决方案。

例如,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 { ... }

ConcurrencyMode的Xml评论基本上与上述内容相同。

如果您需要在消费者之间共享业务逻辑或内存,那么不要使用Singleton,“模型”不会适应问题。这就像在一个姐姐的脚上强迫一个玻璃拖鞋!没有人应该看到这一点。


相反,如果呼叫之间没有共享状态,则每个呼叫会话主持一个实例。

答案 1 :(得分:19)

通常。单身人士是一团糟,因为要让他们表现得很好,你需要让他们多线程,这只是要求麻烦,除非你真的真的知道你在做什么。

WCF的最佳实践是使用每次调用实例化 - 每个请求都有自己的服务类副本,没有多线程担忧,性能良好 - 存储需要在数据库中保留的任何内容 - 就像一个魅力

单例可能有意义的唯一真实情况是,您是否必须使用仅在单个实例中可用的物理资源来使用/处理所有服务请求 - 如果您的单件服务序列化并因此保护单个资源,那么使用它是有道理的。

否则 - 免除麻烦! : - )

答案 2 :(得分:8)

单身WCF服务几乎不应该被使用 - 单身人士是可扩展性的敌人!它们只在奇怪的情况下才有意义 - 记录到单个文件,单个通信端口或硬件设备。

正如Marc所说,使用WCF实现可扩展性的最佳选择是每次呼叫服务(它们提供了性能和可扩展性之间的最佳折衷)。每次呼叫服务也可以很好地与负载平衡配合使用。