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.
samo tutaj pytanie. Gdy windsor zawiedzie, bardzo trudno jest debugować, szczególnie. w IIS –
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