2012-04-02 13 views
0

Wir sind dabei, ein stabiles Projekt von Castle Windsor 2.5.2 auf 3.0 zu migrieren.Nach der Migration zu Windsor 3 schlägt die Registrierung verschiedener Implementierungen aus XML und Code für eine Schnittstelle fehl

Wir verwenden gemischte XML/API-Registrierung. Nach dem Wechsel zu 3.0 können über ctor injizierte und in xml definierte Parameter nicht mehr aufgelöst werden.

Zur Veranschaulichung:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
... 
    <properties> 
    <frontEnd.url>http://site.com</frontEnd.url> 
    <admin.email>[email protected]</admin.email> 
    </properties> 

    <components> 
    ... 
    <component id="ServicesBootstrapperAction" 
    service="SomeNS.Startup.IBootstrapperAction" 
     type="SomeNS.Service.ServicesBootstrapperAction, Project-Service" 
     > 
     <parameters> 
     <frontEndUrl>#{frontEnd.url}</frontEndUrl> 
     <adminEmail>#{admin.email}</adminEmail> 
     <prohibitedLogins>Assets/prohibited-logins.txt</prohibitedLogins> 
     </parameters> 
    </component> 
    ... 
    </components> 
</configuration> 

Und die Registrierung:

 _container.Install(
      Castle.Windsor.Installer.Configuration.FromXmlFile("project.common.config"), 
      Castle.Windsor.Installer.Configuration.FromXmlFile(String.Format("project.{0}.config", RuntimeEnvironment)) 
      ); 

Nach dem Versuch, diese Komponente bekommen wir zu lösen:

'SomeNS.Service.ServicesBootstrapperAction' is waiting for the following dependencies: 
- Parameter 'frontEndUrl' which was not provided. Did you forget to set the dependency? 
- Parameter 'adminEmail' which was not provided. Did you forget to set the dependency? 
- Parameter 'prohibitedLogins' which was not provided. Did you forget to set the dependency? 

Auch dies ist etwas, das perfekt funktioniert mit 2.5 also denke ich, dass es einige undokumentierte (oder verpasste/nicht von uns verstandene) Änderungen geben könnte.

Differenzialdiagnose, jemand?

UPDATE: Ich habe das Problem erkannt und einen Workaround gefunden. Ich mag es nicht, aber es funktioniert.

Für alle neugierig, hier ist der Link zu dem Projekt veranschaulicht das Problem: https://docs.google.com/open?id=0B7XFrOzGfmirSldZUmRQeU9SZDZZVnV5UGhGaGhsUQ

Fühlen Sie sich frei, mir zu sagen, dass ich falsch liege und dass ich einige andere schöne Lösung verwendet haben sollte (was?).

+1

Können Sie einen eigenständigen fehlgeschlagenen Test erstellen? –

+0

@MauricioScheffer, ich wollte. Aber dann habe ich ein Stück Code mit .Unless() bemerkt, das nicht mehr funktioniert, aber irgendwie erlaubt ist. Kurz gesagt, einige Dienste wurden zweimal registriert und in Laufzeit wurde die letzte registrierte Implementierung gewählt. Es ist wirklich traurig, dass Windsor diese Art von Verhalten zugelassen hat. Ich habe immer noch 168 Tests zu beheben. Dann werde ich wieder anfangen zu schimpfen. – Kostassoid

+0

Windsor verwendet den ersten registrierten Dienst, nicht den letzten, und es ist nicht traurig, es ist nützlich und von Entwurf. –

Antwort

0

Ich denke, es ist fair, dieses Problem zu schließen, da ich eine Umgehungsmöglichkeit für mein ursprüngliches Problem gefunden habe.

Mein echtes Problem war, dass ich mehrere Implementierungen für eine Schnittstelle hatte (und sie alle benötigte). Aber einige der Implementierungen erforderten Parameter (einfache Werte), die natürlich in die XML-Konfigurationsdatei verschoben wurden, und andere Implementierungen wurden unter Verwendung von Konventionen im Code registriert.

Jetzt, um doppelte Registrierungen zu vermeiden, habe ich verwendet. Unless (container.Kernel.HasComponent) vor 3.0, die jetzt angeblich veraltet ist, aber kompiliert einfach gut!

Überraschenderweise, .less (t => container.Kernel.HasComponent (t.Name)) funktioniert super wie vorher!

Ich bin mir sicher, dass es eine Erklärung dafür gibt, aber ich kann mir keine vorstellen.

Ich liebe Schloss und genieße es wirklich. Aber 45 kb brechende Änderungen sind nicht cool, sorry Jungs.

0

Versuchen Sie, die Punkte aus Ihren Knotennamen herauszunehmen. Es sollte nicht wichtig sein, aber das ist das einzige, was ich als potentielles Problem sehen könnte (hauptsächlich, weil ich, anders als XAML, nicht viel Zeit in XML-Knotennamen verwendet habe).

+0

Ich habe darüber nachgedacht, und habe es versucht, aber ohne Erfolg. – Kostassoid