在我使用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
的政策是什么?我知道它试图找到什么样的政策我可能会改变这个政策,以便确实需要多次检查。
答案 0 :(得分:2)
这个问题从未解决过,我们最终放弃了Unity,转而采用LightInject,这是一个明显更快的IoC实现,如下所示:
IoC Container Benchmark - Performance comparison
我们实施LightInject时有类似的改进。
答案 1 :(得分:0)
我遇到了类似的远程问题,但我的问题导致了StackOverflowException
。它是由我的一些类之间的循环依赖引起的。