ServiceLocator.Current.GetInstance вызывает чрезмерное количество вызовов ObjectBuilder2.PolicyList.GetNoDefault

В моем MVC4, .NET4.5 веб-приложении, использующем контейнер Unity IoC, в методе 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? Я знал, какую политику он пытается найти, и, возможно, я мог бы изменить эту политику так, чтобы ее нужно было проверять много раз.

2 ответа

Решение

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

IoC Container Benchmark - Сравнение производительности

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

Я столкнулся с похожей проблемой, но моя проблема привела к StackruException, Это было вызвано круговой зависимостью между некоторыми из моих классов.

Другие вопросы по тегам