Frage

Wenn ich in Config definiert:

container.Register(
   Component.For<X.Y.Z.IActivityService>()
            .ImplementedBy<X.Y.Z.ActivityService>()
            .ServiceOverrides(ServiceOverride.ForKey("Listeners").Eq(new [] { typeof(X.Y.Z.DefaultActivityListener).FullName }))
            .LifeStyle.Transient
);

, und ich möchte diese Konfiguration erweitern und ein neues Element in die Hörer-Array-Eigenschaft, so dass die endgültige Konfiguration hinzuzufügen, ist wirksam:

container.Register(
   Component.For<X.Y.Z.IActivityService>()
            .ImplementedBy<X.Y.Z.ActivityService>()
            .ServiceOverrides(ServiceOverride.ForKey("Listeners").Eq(new [] { typeof(X.Y.Z.DefaultActivityListener).FullName, "MyOtherListenerID" }))
            .LifeStyle.Transient
);

muß ich weiß, den Inhalt des „Array“, wenn zuerst die Komponente Registrierung oder kann ich die Komponente Registrierung abrufen und sie hinzufügen?

Ich mag meine Config mit dem Dekorateur Muster so implementieren, dass ich meinen Container bauen kann, und dann erweitern, wie für verschiedene Szenarien benötigt. Das bedeutet, ich brauche die bereits konfigurierten Komponenten zugreifen zu können, und fügen Sie zu ihnen.

dachte an eine Klasse DefaultConfig, die den Standard-Setup zurückkehren und dann einem von mehreren „DecoratedConfig“ Klassen, das würde die Standardkonfiguration erweitern.

Also ich würde

IWindsorContaner c = new DecoratedConfig(new DefaultConfig()).InitialiseContainer();

DefaultConfig würde die ActivityService mit einem DefaultActivityListener einrichten (wie in Beispiel).

DecoratedConfig würde diese ActivityService erkennen hatte seine eigene Listener-Implementierung der Listeners Array auf ActivityService erstellt und hinzuzufügen.

Danke.

War es hilfreich?

Lösung

Melden Sie sich an der Kernel.ComponentModelCreated Veranstaltung. Sie können von dort aus alle Komponenten Parameter ändern. Siehe dieses . Es ist nicht wird eine Anlage sein, der dies tut, aber es ist bequem.

Andere Tipps

@mausch, Justierteil die ComponentModel Konfiguration scheint die Lösung zu sein.

Der folgende Test effecitvely tut, was ich verlangen, ohne auf den ComponentModelCreatedEvent Haken in mit, damit ich die Änderungen vornehmen kann, selbst nachdem das Komponentenmodell erstellt wird.

Ich werde die Funktionalität als Erweiterung Methode wickeln, und versuchen, zu einer fließend API passen.

[TestMethod]
public void ArrayPropertyTestApi3()
{
    using (Castle.Windsor.WindsorContainer container = new Castle.Windsor.WindsorContainer())
    {
        container.Register(Component.For<Components.A>().ServiceOverrides(ServiceOverride.ForKey("I").Eq(new[] { typeof(Components.B).FullName })));
        container.Register(Component.For<Components.B>());
        container.Register(Component.For<Components.C>());

        IHandler h = container.Kernel.GetHandler(typeof(Components.A));
        if (h != null)
        {
            var config = h.ComponentModel.Configuration;
            if (config != null)
            {
                var items = config.Children.Single(c => c.Name == "parameters")
                                  .Children.Single(c => c.Name == "I")
                                  .Children.Single(c => c.Name == "list")
                                  as MutableConfiguration;

                items.Children.Add(new MutableConfiguration("item", string.Format("${{{0}}}", typeof(Components.C).FullName)));
            }
        }

        Components.A svc = container.Resolve<Components.A>();
        Assert.IsTrue(svc.I.Length == 2);
        Assert.IsTrue(svc.I[0].Name == "B");
        Assert.IsTrue(svc.I[1].Name == "C");
    }
}

Es ist bevorzugt, die Component Bau Mitwirkende mit dem IContributeComponentModelConstruction zu verwenden Schnittstelle, da es der empfohlene Weg, um Ihre Komponenten weiter zu konfigurieren.

Um dies zu tun, würden Sie die Schnittstelle implementieren, um die Änderungen zu spezifizieren Konfiguration anzuwenden

public class ChangeConfiguration : IContributeComponentModelConstruction
{
    public void ProcessModel(IKernel kernel, ComponentModel model)
    {
        // filter your model to match the subset you're interested in
        // change the configuration for matching models
    }
}

Dann, bevor Sie Komponenten Registrierung, die Sie gerade die Klasse zu Ihrem Container hinzuzufügen:

container.Kernel.ComponentModelBuilder.AddContributor(new ChangeConfiguration());

Alle Komponenten werden dann durch diese Klasse übergeben, in dem Sie ihre Konfiguration ändern können. In Ihrem Fall changeing Hörer Liste, etc. (Ich denke, das der bisherige Name des Abfangjäger ist)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top