0

在我使用 Unity IoC 容器的 MVC4 .NET4.5 Web 应用程序中,在 IoCContainerFactory.GetControllerInstance() 方法中,我们使用 ServiceLocator.Current.GetInstance 来获取控制器实例:

public class IoCControllerFactory : DefaultControllerFactory
{
    protected override IController GetControllerInstance(
         System.Web.Routing.RequestContext requestContext, Type controllerType)
    {
        // snip other code
        // this is the problem line:
        return ServiceLocator.Current.GetInstance(controllerType) as IController;
    }
}

但这一直表现得太慢。使用 JetBrains DotNetTrace 产品,我发现 ServiceLocator.Current.GetInstance 似乎调用 ObjectBuilder2.PolicyList.GetNoDefault 超过一百万次。我怎样才能弄清楚为什么它会打这么多电话,我能做些什么来解决这个问题?附加的屏幕截图显示了 dotnetTrace 的输出:

在此处输入图像描述

它试图在该方法中采用什么政策PolicyList.GetNoDefault?我知道它试图找到什么策略,我也许可以更改该策略,以便它确实需要检查很多次。

4

2 回答 2

2

这个问题从未解决,我们最终放弃了 Unity,转而使用 LightInject,这是一个明显更快的 IoC 实现,如下所示:

IoC 容器基准 - 性能比较

我们在实施 LightInject 时也有类似的改进。

于 2014-05-19T02:05:53.700 回答
0

我遇到了一个远程类似的问题,但我的问题导致了StackOverflowException. 这是由我的一些类之间的循环依赖引起的。

于 2018-06-12T12:07:25.153 回答