2013-10-26 12 views
7

La mia squadra ha provato qualche tempo fa a iniziare a utilizzare Castle Windsor (3.2.0) per la qualità IoC. Il nostro processo viene eseguito su scatole di sviluppo è andato peachy, ma quando abbiamo cercato di eseguire il codice sul server di produzione, non è riuscito con la seguente eccezioneCome eseguire il debug dell'istanza di installazione/registrazione di 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[]) 

Questo è stato un bloccante per noi e si è rivelato molto difficile da google. Recentemente ho avuto un po 'di tempo per risolvere il problema e ho corretto il debugging sul fatto che un componente aveva un riferimento/dipendenza espliciti (C#, non windsor) su una dll MVC 3. Il server era appena stato commissionato e aveva solo MVC 4 installato. Tutte le finestre di sviluppo hanno installato MVC 3, rendendo il problema riproducibile solo in produzione.

Ho eseguito il debug di questo binario commentando il codice di registrazione del componente, convertendo le registrazioni di massa in registrazione per componente, e quindi fissando il componente incriminato finché non ho fatto clic sul posto giusto e ho avuto un'illuminazione.

La mia domanda è ora, c'era un modo migliore che avrei potuto eseguire il debug di questo? Potrei aver dato a Windsor informazioni migliori? E perché questo era un problema per Windsor quando non era nel normale caso non Windsor? Io e il team siamo un po 'diffidenti nell'usare Windsor ora, data la cattiveria degli errori non googlable riproducibili solo in produzione, quindi spero di aver perso alcuni modi per affrontare questo problema.

+0

Stessa domanda qui. Quando il windsor fallisce, è molto difficile eseguire il debug, esp. in IIS –

+0

Ho smesso di usare IoC molto tempo fa, è un anti-pattern. IoC rende il codice meno vincolato, ma il costo è che non puoi semplicemente premere F12 per seguire un nome di metodo per la sua implementazione. E poi ci sono problemi come questo. Troppe persone scelgono IoC perché sembra elaborato e complicato. Spesso è IoC con EF e il livello di repository: questo non dovrebbe quasi mai accadere. Ad ogni modo - cavalli per i corsi: a volte hai solo bisogno di un pattern singleton, o di un pattern factory, o dell'ereditarietà (ricorda Object Oriented?), O una chiamata al metodo statico. Scusa, non posso aiutarti con il tuo inferno IoC oggi. – Todd

risposta

1

Può essere questa risposta vi aiuterà ad avere una migliore informazione durante il debug roba: https://stackoverflow.com/a/9539679/1158735

+0

Le risposte a collegamento singolo, anche a SO Q & A, non sono grandiose per SO. Questo dovrebbe essere un commento. – jdv