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?).
Können Sie einen eigenständigen fehlgeschlagenen Test erstellen? –
@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
Windsor verwendet den ersten registrierten Dienst, nicht den letzten, und es ist nicht traurig, es ist nützlich und von Entwurf. –