2013-10-26 4 views
7

Моя команда попыталась некоторое время назад начать использовать замок Виндзор (3.2.0) для доброты IoC. Наше испытание работает на коробках развития пошли персиковый, но когда мы пытались запустить код на сервере, он не смог за исключением следующегоКак отлаживать исключение установки/регистрации Castle Windsor

Application: XXXX 
Framework Version: v4.0.30319 
Description: The process was terminated due to an unhandled exception. 
Exception Info: System.IO.FileNotFoundException 
Stack: 
    at System.Signature.GetSignature(Void*, Int32, System.RuntimeFieldHandleInternal, System.IRuntimeMethodInfo, System.RuntimeType) 
    at System.Reflection.RuntimeMethodInfo.get_Signature() 
    at System.Reflection.RuntimeMethodInfo.GetParametersNoCopy() 
    at System.Reflection.RuntimePropertyInfo.GetIndexParametersNoCopy() 
    at System.Reflection.RuntimePropertyInfo.GetIndexParameters() 
    at Castle.MicroKernel.ModelBuilder.Inspectors.PropertiesDependenciesModelInspector.IsValidPropertyDependency(System.Reflection.PropertyInfo) 
    at System.Linq.Enumerable+WhereArrayIterator`1[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].MoveNext() 
    at System.Collections.Generic.List`1[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]..ctor(System.Collections.Generic.IEnumerable`1<System.__Canon>) 
    at System.Linq.Enumerable.ToList[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]](System.Collections.Generic.IEnumerable`1<System.__Canon>) 
    at Castle.MicroKernel.ModelBuilder.Inspectors.PropertiesDependenciesModelInspector.InspectProperties(Castle.Core.ComponentModel) 
    at System.Collections.Generic.List`1[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].ForEach(System.Action`1<System.__Canon>) 
    at Castle.MicroKernel.ModelBuilder.DefaultComponentModelBuilder.BuildModel(Castle.MicroKernel.ModelBuilder.IComponentModelDescriptor[]) 
    at Castle.MicroKernel.Registration.ComponentRegistration`1[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].Castle.MicroKernel.Registration.IRegistration.Register(Castle.MicroKernel.IKernelInternal) 
    at Castle.MicroKernel.DefaultKernel.Register(Castle.MicroKernel.Registration.IRegistration[]) 
    at Castle.Windsor.WindsorContainer.Register(Castle.MicroKernel.Registration.IRegistration[]) 
    at Sproom.Web.Infrastructure.WindsorInstaller.Install(Castle.Windsor.IWindsorContainer, Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore) 
    at Castle.Windsor.Installer.AssemblyInstaller.Install(Castle.Windsor.IWindsorContainer, Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore) 
    at Castle.Windsor.Installer.CompositeInstaller.Install(Castle.Windsor.IWindsorContainer, Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore) 
    at Castle.Windsor.WindsorContainer.Install(Castle.MicroKernel.Registration.IWindsorInstaller[], Castle.Windsor.Installer.DefaultComponentInstaller) 
    at Castle.Windsor.WindsorContainer.Install(Castle.MicroKernel.Registration.IWindsorInstaller[]) 

Это остановит всю работу для нас, и оказалось довольно трудно Google. Недавно у меня было время, чтобы бросить эту проблему и успешно отлаживали ее до того, что у компонента была явная ссылка/зависимость (C#, а не windsor) на dll MVC 3. Сервер был недавно введен в эксплуатацию, и был установлен только MVC 4. Во всех dev-блоках установлен MVC 3, что делает проблему только воспроизводимой при производстве.

Я отлаживал это путем двоичного кода регистрации компонентов, преобразовывая массовые регистрации в регистрацию каждого компонента, а затем смотрел на нарушающий компонент, пока я не щелкнул нужное место и не имел прозрения.

Вопрос теперь, был ли лучший способ, которым я мог бы отладить это? Мог ли я, чтобы Виндзор дал лучшую информацию? И почему это было проблемой для Виндзора, когда это было не в обычном случае, не в Виндзоре? Я и команда немного извиняются за использование Windsor сейчас, учитывая, что отвратительность ошибок, не связанных с ошибкой, воспроизводится только на производстве, поэтому, надеюсь, я пропустил несколько хороших способов решения этой проблемы.

+0

Тот же вопрос здесь. Когда windsor терпит неудачу, его очень сложно отлаживать, особенно. в IIS –

+0

Я прекратил использовать IoC давным-давно, это анти-шаблон. IoC делает код менее жестко привязанным, но стоимость заключается в том, что вы не можете просто нажать F12, чтобы следовать имени метода для его реализации. И тогда есть такие проблемы. Слишком много людей выбирают IoC, потому что это звучит необычно и сложно. Часто это IoC со слоем EF и Repository: этого почти никогда не бывает. В любом случае - лошади для курсов: иногда вам нужен только одноэлементный шаблон или шаблон фабрики или наследование (помните Object Oriented?) Или вызов статического метода. Извините, я не могу помочь с вашим адском IoC сегодня. – Todd

ответ

1

Может быть, этот ответ поможет вам получить более полную информацию во время отладки материала: https://stackoverflow.com/a/9539679/1158735

+0

Одноканальные ответы, даже для SO Q & A, не очень хороши для SO. Это должен быть комментарий. – jdv

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