InstanceContextMode进行转换.单个到InstanceContextMode.PerCall

本文关键字:InstanceContextMode PerCall 单个 转换 | 更新日期: 2023-09-27 18:03:36

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

我的问题是加载数据需要很长时间。根据这篇文章,它说的是使用静态变量为实际服务创建一个包装器。我不确定那看起来如何,我不知道什么是真正的容器。有人能给我举一个完整的例子吗?

在初始化步骤冗长且不可避免的情况下,或者您的类在构造函数中需要许多参数(例如,当您以编程方式托管从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
{
}

对于会话服务,session实例上下文模式给出您将获得PerCall实例上下文模式的所有好处同时减少了额外并发所带来的开销因为不再为每个类创建新的实例

InstanceContextMode进行转换.单个到InstanceContextMode.PerCall

您可以从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
    {
    }