ServiceLocator.Current.GetInstance导致对ObjectBuilder2.PolicyList.GetNoDefault的过多调用

时间:2013-09-14 23:21:27

标签: c# asp.net-mvc-4 service-locator objectbuilder

在我使用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的输出:

enter image description here

它试图进入方法PolicyList.GetNoDefault的政策是什么?我知道它试图找到什么样的政策我可能会改变这个政策,以便确实需要多次检查。

2 个答案:

答案 0 :(得分:2)

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

IoC Container Benchmark - Performance comparison

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

答案 1 :(得分:0)

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