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
, Это было вызвано круговой зависимостью между некоторыми из моих классов.