Schloss Windsor: Wie kann ich eine Komponenten-Registrierung aktualisieren
-
06-09-2019 - |
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.
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)