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

sue*_*uno 21 wcf singleton

我相信吉米尼尔森说他一般都是自己的网络服务单身人士.这是首选方法,还是使用WCF?除了使服务方法保持静态之外,还有什么要做的吗?

joh*_*y g 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 { ... }
Run Code Online (Sandbox Code Playgroud)

// 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 { ... }
Run Code Online (Sandbox Code Playgroud)

Xml评论ConcurrencyMode基本上与上面说的一样.

如果您不要需要共享消费者之间的业务逻辑或存储器中,然后不要使用单例,"模型" DOES NOT适应问题.这就像在一个姐姐的脚上强迫一个玻璃拖鞋!没有人应该看到这一点.


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


mar*_*c_s 20

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

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

单例可能有意义的唯一真实场景是,如果必须让所有服务请求都由仅在单个实例中可用的物理资源使用/处理 - 如果您的单例服务序列化并因此保护单个资源,那么它是有意义的使用它.

否则 - 免除麻烦!:-)


Ric*_*dOD 8

几乎不会使用Singleton WCF服务 - 单身人士是可扩展性的敌人!它们只在奇怪的场景中有意义 - 记录到单个文件,单个通信端口或硬件设备.

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