解析应用服务耗时1秒
Resolve application service spent 1 second
我们在真正的产品中为用户使用了 abp。还有api,很简单,但是它的响应时间大约是1秒。我们认为不应该,于是我们调查了一下,发现应用服务方法的执行时间大约是100ms,解析应用服务用了大约1秒。
我们使用IocManager.RegisterAssemblyByConvention(thisAssembly) 进行注册。
以下截图来自用于调查的日志文件:
我的问题是:
- 为什么解析器花了这么多时间?
- 解决此问题的正确方法是什么。
之前,我们使用默认的 DependencyLifeStyle 作为 Transient,我们做了一些更改以将 DependencyLifeStyle 设置为每个请求。而且现在下决心这么快
代码修改如下:
public override void PreInitialize()
{
IocManager.IocContainer.Kernel.ComponentRegistered += Kernel_ComponentRegistered;
}
private void Kernel_ComponentRegistered(string key, IHandler handler)
{
foreach (var interceptor in interceptors)
{
if (interceptor.Key.IsAssignableFrom(handler.ComponentModel.Implementation))
{
handler.ComponentModel.Interceptors.Add(new InterceptorReference(interceptor.Value));
}
}
if (handler.ComponentModel.Implementation.Assembly.FullName.Contains(".Domain"))
{
if (handler.ComponentModel.LifestyleType == LifestyleType.Transient)
{
IocManager.IocContainer.Register(
Component
.For(handler.ComponentModel.Implementation)
.ImplementedBy(handler.ComponentModel.Implementation)
.LifestyleCustom<MsScopedLifestyleManager>()
.IsDefault()
.Named($"{key}-1")
);
}
}
}
我们在真正的产品中为用户使用了 abp。还有api,很简单,但是它的响应时间大约是1秒。我们认为不应该,于是我们调查了一下,发现应用服务方法的执行时间大约是100ms,解析应用服务用了大约1秒。
我们使用IocManager.RegisterAssemblyByConvention(thisAssembly) 进行注册。
以下截图来自用于调查的日志文件:
我的问题是:
- 为什么解析器花了这么多时间?
- 解决此问题的正确方法是什么。
之前,我们使用默认的 DependencyLifeStyle 作为 Transient,我们做了一些更改以将 DependencyLifeStyle 设置为每个请求。而且现在下决心这么快
代码修改如下:
public override void PreInitialize()
{
IocManager.IocContainer.Kernel.ComponentRegistered += Kernel_ComponentRegistered;
}
private void Kernel_ComponentRegistered(string key, IHandler handler)
{
foreach (var interceptor in interceptors)
{
if (interceptor.Key.IsAssignableFrom(handler.ComponentModel.Implementation))
{
handler.ComponentModel.Interceptors.Add(new InterceptorReference(interceptor.Value));
}
}
if (handler.ComponentModel.Implementation.Assembly.FullName.Contains(".Domain"))
{
if (handler.ComponentModel.LifestyleType == LifestyleType.Transient)
{
IocManager.IocContainer.Register(
Component
.For(handler.ComponentModel.Implementation)
.ImplementedBy(handler.ComponentModel.Implementation)
.LifestyleCustom<MsScopedLifestyleManager>()
.IsDefault()
.Named($"{key}-1")
);
}
}
}