我有一个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实例上下文模式的所有好处 同时减少了为额外并发性支付的开销 因为不再为每个实例创建类的新实例 请求,但每次会议。
答案 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
{
}