Ich habe eine Klasse, die mehrere Schnittstellen implementiert. Ich möchte diese Schnittstellen per XML registrieren. Alles, was ich gefunden habe, ist Dokumentation für das neue Fluent Interface. Wird diese Option über XML unterstützt? Was wäre beim Hinzufügen dieser Funktion beteiligt?Unterstützt Castle-Windsor ForwardedTypes über XML-Konfiguration
Antwort
[Aktualisierung] Dies ist jetzt in Windsor 2.1 oder neuer möglich. Siehe die Dokumentation für die Syntax here.
Diese Funktion in dem XML-Interpreter implementiert hat, als der noch .. aber es für sie über eine Einrichtung (natürlich diese Technik ist auch nützlich, wenn zu wollen weitere Features fehlen nicht schwer ist, um Unterstützung nicht der vorhandene Konfigurationsparser).
Also zunächst einmal fügen wir eine Anlage, die erkennt, wenn ein Handler für einen Typen erstellt wird, und zur gleichen Zeit werden jede der übermittelten Dienste registrieren lassen, damit sie an die bestehenden Handler zeigen:
public class HandlerForwardingFacility : AbstractFacility
{
IConversionManager conversionManager;
protected override void Init()
{
conversionManager = (IConversionManager)Kernel.GetSubSystem(SubSystemConstants.ConversionManagerKey);
Kernel.HandlerRegistered += new HandlerDelegate(Kernel_HandlerRegistered);
}
void Kernel_HandlerRegistered(IHandler handler, ref bool stateChanged)
{
if (handler is ForwardingHandler) return;
var model = handler.ComponentModel;
if (model.Configuration == null) return;
var forward = model.Configuration.Children["forward"];
if (forward == null) return;
foreach (var service in forward.Children)
{
Type forwardedType = (Type)conversionManager.PerformConversion(service, typeof (Type));
Kernel.RegisterHandlerForwarding(forwardedType, model.Name);
}
}
}
und dann natürlich müssen wir nutzen dies in Code machen, für dieses Beispiel, das ich ein mutiertes Ente/Hund Komponente haben werde, die zwei separate Dienste unterstützt - iDuck und IDog:
public interface IDog
{
void Bark();
}
public interface IDuck
{
void Quack();
}
public class Mutant : IDog, IDuck
{
public void Bark()
{
Console.WriteLine("Bark");
}
public void Quack()
{
Console.WriteLine("Quack");
}
}
nun tatsächlich konfigurieren der Behälter:
<castle>
<facilities>
<facility id="facility.handlerForwarding" type="Example.Facilities.HandlerForwardingFacility, Example" />
</facilities>
<components>
<component id="mutant" service="Example.IDog, Example" type="Example.Mutant, Example">
<forward>
<service>Example.IDuck, Example</service>
</forward>
</component>
</components>
</castle>
Und jetzt können wir gerne einen Test wie folgt durchführen:
WindsorContainer container = new WindsorContainer(new XmlInterpreter());
var dog = container.Resolve<IDog>();
var duck = container.Resolve<IDuck>();
Assert.AreSame(dog, duck);
Hoffnung, das hilft.
Nur damit Sie wissen, es ist jetzt in das Framework gebacken. –
@Krzysztof: Ich benötige diese Funktionalität und möchte das Rad nicht neu erfinden. Leider kann ich dazu nichts finden. Irgendwelche Dokumentationen oder Links bezüglich der integrierten Typ-Weiterleitung über die Xml-Konfiguration? –
Johny g - es ist in der Dokumentation: http://www.castleproject.org/container/documentation/v21/manual/windsorconferef.html –