2013-09-14 4 views
0

В моем MVC4 веб-приложении .NET4.5 с использованием контейнера Unity IoC в методе IoCContainerFactory.GetControllerInstance() мы используем ServiceLocator.Current.GetInstance для получить экземпляр контроллера:ServiceLocator.Current.GetInstance вызывает чрезмерное количество вызовов ObjectBuilder2.PolicyList.GetNoDefault

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

Эта проблема никогда не была решена, и мы закончили тем, сбросив Единство в пользу LightInject, что значительно быстрее реализации IoC, как показано здесь:

IoC Container Benchmark - Performance comparison

У нас были подобные улучшения, когда мы реализовали LightInject.

 Смежные вопросы

  • Нет связанных вопросов^_^