将InstanceContextMode.Single转换为InstanceContextMode.PerCall

时间:2016-08-23 19:44:20

标签: c# .net wcf

我有一个WCF服务,花费5分钟从数据库加载所有内容。我希望从WCF中获得最佳性能并找到这篇文章http://theburningmonk.com/2010/05/wcf-improve-performance-with-greater-concurrency/ 它表示我将使用PerCall获得更好的性能。我每秒有2000到4000次点击。

我的问题是加载数据需要很长时间。根据文章,它说使用静态变量创建实际服务的包装器。 我不知道那看起来如何,我不知道_container究竟是什么。 有人可以给我一个完整的例子吗?

  

如果初始化步骤很长且不可避免,或者您的类在构造函数中需要许多参数(例如,当您以编程方式从IoC容器中托管服务检索时),则无参数构造函数可能会成为问题。为了解决这个问题,你可以为你的类创建一个包装器,并将包装器作为服务公开,但是保存一个基础服务的静态实例,所有请求都传递给它:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class MyServiceWrapper : IMyServiceWrapper
{
    // get the underlying service from the container
    private static IMyService MyService = _container.Resolve<IMyService>();


public MyServiceWrapper()
{
    // parameterless constructor which does nothing, so easy to constructor
}
public void DoSomething()
{
    MyService.DoSomething();
}

}

// dummy interface to ensure the wrapper has the same methods as the underlying service
// but helps to avoid confusion
public interface IMyServiceWrapper : IMyService
{
}
  

对于会话服务,PerSession实例上下文模式给出   您将获得PerCall实例上下文模式的所有好处   同时减少了为额外并发性支付的开销   因为不再为每个实例创建类的新实例   请求,但每次会议。

1 个答案:

答案 0 :(得分:1)

您可以删除从IOC容器中获取服务对象的逻辑:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
    public class MyServiceWrapper : IMyServiceWrapper
    {
        // get the underlying service from the container
        private static IMyService myService = new MyService();


        public MyServiceWrapper()
        {
            // parameterless constructor which does nothing, so easy to constructor
        }
        public void DoSomething()
        {
            myService.DoSomething();
        }
    }

    // dummy interface to ensure the wrapper has the same methods as the underlying service
    // but helps to avoid confusion
    public interface IMyServiceWrapper : IMyService
    {
    }