2013-10-26 24 views
7

Mój zespół próbował jakiś czas temu, aby rozpocząć korzystanie z Castle Windsor (3.2.0) dla dobra IoC. Nasz proces przebiega na polach rozwoju poszedł aksamitny, ale kiedy staraliśmy się uruchomić kod na serwerze produkcyjnym, nie udało się z następującym wyjątkiemJak zdemontować wyjątek instalacji/rejestracji 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[]) 

To był showstopper dla nas i okazało się dość trudne do google. Niedawno miałem trochę czasu, aby rzucić na problem i pomyślnie debugowałem go do faktu, że składnik miał wyraźne odniesienie/zależność (C#, nie windsor) na dll MVC 3. Serwer był nowozapisany i zainstalowano tylko MVC 4. Wszystkie skrzynki dev miały zainstalowaną MVC 3, przez co problem był odtwarzalny tylko podczas produkcji.

I debugowałem to przez binarne komentowanie kodu rejestracyjnego komponentu, konwersję rejestracji masowych na rejestrację na komponent, a następnie wpatrywanie się w komponent naruszający prawa, aż kliknąłem właściwe miejsce i miałem objawienie.

Moje pytanie brzmi teraz, czy istnieje lepszy sposób, w jaki mógłbym to debugować? Czy mogłem poprosić Windsora o lepsze informacje? I dlaczego był to problem dla Windsora, kiedy nie było go w normalnym przypadku niezwiązanym z Windsor? Ja i zespół jesteśmy trochę nieufni w używaniu Windsora, zważywszy na nieprzyjemne błędy nie dające się googlable odtwarzać tylko podczas produkcji, więc mam nadzieję, że przegapiłem kilka fajnych sposobów rozwiązania tego problemu.

+0

samo tutaj pytanie. Gdy windsor zawiedzie, bardzo trudno jest debugować, szczególnie. w IIS –

+0

Przestałem używać IoC dawno temu, jest to anty-wzór. IoC sprawia, że ​​kod jest mniej ściśle związany, ale kosztem nie można po prostu nacisnąć klawisza F12, aby podążać za nazwą metody do jej implementacji. A potem są takie problemy. Zbyt wielu ludzi wybiera IoC, ponieważ brzmi to fantazyjnie i skomplikowanie. Często jest to IoC z warstwą EF i Repository: to prawie nigdy nie powinno się zdarzyć. W każdym razie - konie na kursy: Czasami potrzebny jest tylko wzór singletonowy, wzór fabryczny, dziedziczenie (pamiętaj o Object Oriented?) Lub wywołanie metody statycznej. Przepraszam, że dziś nie mogę pomóc w piekle IoC. – Todd

Odpowiedz