Question

Si j'ai défini dans la configuration:

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
);

et je souhaite étendre cette configuration et d'ajouter un nouvel élément à la propriété de tableau de telle sorte que la Listeners configuration finale est efficace:

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
);

dois-je connaître le contenu de la « matrice » lors de la première enregistrement du composant, ou puis-je récupérer l'enregistrement des composants et ajouter?

Je souhaite mettre en œuvre ma config en utilisant le modèle de décorateur tel que je peux construire mon conteneur, puis l'étendre au besoin pour des scénarios différents. Cela signifie que je dois être en mesure d'accéder aux composants déjà configurés et ajouter.

Pensais d'avoir un DefaultConfig de classe qui retourne la configuration par défaut, puis l'une des plus classes « DecoratedConfig », qui étendrait la configuration par défaut.

J'aurais

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

DefaultConfig serait mis en place le ActivityService avec un DefaultActivityListener (comme indiqué dans l'exemple).

DecoratedConfig reconnaîtrait ActivityService avait été créé et ajouter sa propre implémentation de Listener au tableau de Listeners sur ActivityService.

Merci.

Était-ce utile?

La solution

Inscrivez-vous à l'événement Kernel.ComponentModelCreated. Vous pouvez modifier tous les paramètres composant à partir de là. Voir cette . Il ne Vous pour être un établissement qui fait cela, mais il est pratique.

Autres conseils

@mausch, adusting la configuration ComponentModel semble être la solution.

Le test ci-dessous ne effecitvely ce que je demande sans avoir à brancher dans la ComponentModelCreatedEvent afin que je puisse faire les changements, même après le modèle de composant est créé.

Je terminerai la fonctionnalité en tant que méthode d'extension, et d'essayer de répondre à une API couramment.

[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");
    }
}

Il est préférable d'utiliser le contributeurs de construction ComponentModel avec le IContributeComponentModelConstruction l'interface, car il est la méthode recommandée pour la configuration davantage vos composants.

Pour ce faire, vous implémentent l'interface pour spécifier les modifications à appliquer à la configuration

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
    }
}

Ensuite, avant d'enregistrer vos composants, vous ajoutez simplement la classe à votre conteneur:

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

Tous les composants passeront alors par cette classe, où vous pouvez modifier leur configuration. Dans votre cas changeing la liste d'écoute, etc (je suppose que cela est le nom précédent des intercepteurs)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top