在应用WCF这样一款功能强大的开发工具的前提下,我们需要熟练的掌握其中的各种应用技术以及功能的了解,这样才能有助于我们的实际应用。在这里我们将会为大家介绍一下WCF服务实例单一性的实现方法。
了让读者对单例实例上下文模式有一个直观的认识,我们通过一个简单的案例演示单例模式下WCF服务实例单一性。这里使用前面章节使用过的累加器的例子,下面是服务契约和服务实现的定义:在初始化时,运算的结果为零,通过Add方法仅仅对结果累加,计算的结果通过GetResult操作返回。在CalculatorService上面,通过System.ServiceModel.ServiceBehaviorAttribute将服务设定为单例模式。
- using System.ServiceModel;
- namespace Artech.WcfServices.Contracts
- {
- [ServiceContract(Namespace="http://www.artech.com/")]
- public interface ICalculator
- {
- [OperationContract]
- void Add(double x);
- [OperationContract]
- double GetResult();
- }
- }
- using System.ServiceModel;
- using Artech.WcfServices.Contracts;
- namespace Artech.WcfServices.Services
- {
- [ServiceBehavior(InstanceContextModeInstanceContextMode =
InstanceContextMode.Single)]- public class CalculatorService : ICalculator
- {
- private double _result;
- public void Add(double x)
- { 11: this._result += x;
- }
- public double GetResult()
- {
- return this._result;
- }
- }
- }
在客户端,通过ChannelFactory<ICalculator>创建两个服务代理,模拟两个不同的客户端。从最终输出来看,得到的结果并不能反映出具体某个客户端正常的累加运算(对于通过calculator2模拟的客户端,仅仅调用了一次Add(3),得到的结果却是6)这是所有客户端一起累加的结果,这就是WCF服务实例单一性造成。
- using (ChannelFactory<ICalculator> channelFactory =
new ChannelFactory<ICalculator>("calculatorservice"))- {
- ICalculator calculator1 = channelFactory.CreateChannel();
- ICalculator calculator2 = channelFactory.CreateChannel();
- Console.WriteLine("1st serivce proxy:");
- Console.WriteLine("Add(3);");
- calculator1.Add(3);
- Console.WriteLine("The result is {0}.\n", calculator1.GetResult());
- Console.WriteLine("2nd serivce proxy:");
- Console.WriteLine("Add(3);");
- calculator2.Add(3);
- Console.WriteLine("The result is {0}.", calculator2.GetResult());
- }
输出结果:
- 1st serivce proxy:Add(3);
- The result is 3.
- 2nd serivce proxy:Add(3);
- The result is 6.
以上就是我们对WCF服务实例单一性的相关介绍。
【编辑推荐】