2013-10-26 12 views
7

Mein Team versuchte vor einiger Zeit, Burg Windsor (3.2.0) für IoC-Güte zu verwenden. Unsere Studie läuft auf Entwicklung Boxen ging peachy, aber als wir versuchten, den Code auf dem Produktions-Server zu laufen, es scheiterte mit folgender AusnahmeSo debuggen Castle Windsor Installation/Registrierung Ausnahme

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[]) 

Dies ist ein Hemmschuh für uns war, und erwies sich als sehr schwierig zu googeln. Ich hatte kürzlich etwas Zeit, um das Problem zu lösen, und es erfolgreich debuggte es auf die Tatsache, dass eine Komponente eine explizite Referenz/Abhängigkeit (C#, nicht windsor) auf einer MVC 3-DLL hatte. Der Server war neu in Betrieb genommen und hatte nur MVC 4 installiert. In allen Entwicklungscontainern war MVC 3 installiert, wodurch das Problem nur in der Produktion reproduzierbar war.

Ich debuggte dies durch binäre Kommentierung von Komponentenregistrierungscode, Konvertieren von Massenregistrierungen zu pro-Komponentenregistrierung und dann starrte auf die problematische Komponente, bis ich an der richtigen Stelle klickte und eine Epiphanie hatte.

Meine Frage ist jetzt, gab es einen besseren Weg, dass ich das hätte debuggen können? Hätte ich Windsor bessere Informationen geben können? Und warum war das für Windsor ein Problem, wenn es nicht im normalen Nicht-Windsor-Fall war? Ich und das Team sind ein bisschen misstrauisch, Windsor jetzt zu benutzen, angesichts der Bösartigkeit nicht-googelnder Fehler, die nur bei der Produktion reproduzierbar sind, und ich hoffe, ich habe ein paar nette Wege verpasst, dieses Problem anzugehen.

+0

Gleiche Frage hier. Wenn windsor fehlschlägt, ist es sehr schwer zu debuggen, besonders. in IIS –

+0

Ich habe vor langer Zeit mit IoC aufgehört, es ist ein Anti-Pattern. IoC macht Code weniger eng gebunden, aber die Kosten sind, dass Sie nicht einfach F12 drücken können, um einem Methodennamen zu seiner Implementierung zu folgen. Und dann gibt es solche Probleme. Zu viele Leute wählen IoC, weil es kompliziert und kompliziert klingt. Oft ist es IoC mit EF und Repository-Schicht: das sollte fast nie passieren. Wie auch immer - Pferde für Kurse: Manchmal brauchen Sie nur ein Singleton-Muster oder ein Fabrikmuster oder eine Vererbung (erinnern Sie sich an objektorientierte?) Oder einen statischen Methodenaufruf. Entschuldigung, ich kann heute nicht mit deiner IoC-Hölle helfen. – Todd

Antwort

Verwandte Themen