2009-11-05 6 views
0

Je voudrais créer plusieurs services similaires qui peuvent être éteints et accessibles par leur nom (= touches).Comment créer plusieurs composants d'un service avec des dépendances c'tor

Pour la mise en œuvre du service que je veux utiliser des classes avec dépendances c'tor comme ceci:

public interface IXYService 
{ 
string Tag { get; set; } 
} 

public class _1stXYService : IXYService 
{ 
public _1stXYService(string Tag) 
    { 
     this.Tag = Tag; 
    } 

    public string Tag { get; set; } 
} 

Ce que j'ai essayé était d'utiliser « AddComponentWithProperties » d'avoir une instance concrète créé qui est accessible par une clé donnée :

... 
    IDictionary l_xyServiceInitParameters = new Hashtable { { "Tag", "1" } }; 
    l_container.AddComponentWithProperties 
     (
      "1st XY service", 
      typeof(IXYService), 
      typeof(_1stXYService), 
      l_xyServiceInitParameters 
     ); 

    l_xyServiceInitParameters["Tag"] = "2"; 
    l_container.AddComponentWithProperties 
     (
      "2nd XY service", 
      typeof(IXYService), 
      typeof(_1stXYService), 
      l_xyServiceInitParameters 
     ); 
... 

var service = l_container[serviceName] as IXYService; 

Toutefois, les dépendances n'ont pas été résolues et par conséquent, les services ne sont pas disponibles.

L'utilisation de IWindsorContainer.Resolve (...) pour renseigner les paramètres n'est pas souhaitée.

La construction par XML fonctionne, mais n'est pas suffisante dans tous les cas.

Comment pourrais-je atteindre mes objectifs?

+0

si vous voulez résoudre le service par sa propriété Tag? –

+0

Tous les composants windsor ont un ID, qui est une chaîne. Cela serait-il suffisant? Ou doit-il être votre propre propriété Tag? –

+0

L'ID, dans le cas d'utilisation de 'AddComponentWithProperties', c'est le paramètre 'clé' qui correspondrait parfaitement. Dans l'exemple, ce sont les clés "1er service XY" et "2ème service XY". – apollo

Répondre

2

Si vous cherchez à définir la propriété Tag lors de l'inscription en temps:

[Test] 
public void Named() { 
    var container = new WindsorContainer(); 
    container.Register(Component.For<IXYService>() 
     .ImplementedBy<_1stXYService>() 
     .Parameters(Parameter.ForKey("Tag").Eq("1")) 
     .Named("1st XY Service")); 
    container.Register(Component.For<IXYService>() 
     .ImplementedBy<_1stXYService>() 
     .Parameters(Parameter.ForKey("Tag").Eq("2")) 
     .Named("2nd XY Service")); 

    Assert.AreEqual("2", container.Resolve<IXYService>("2nd XY Service").Tag); 
} 
+0

Merci Mauricio, de cette façon ça marche comme prévu! Je suppose que je devrais mettre un livre sur "Windsor Castle" sur ma liste de souhaits pour Noël pour découvrir les nombreuses façons de pousser et de tirer des objets dans et à partir du conteneur. – apollo

+0

hey, c'est considéré ;-) http://castle.uservoice.com/pages/16605-official-castle-project-feedback-forum/suggestions/327076-we-should-write-a-using-castle-book ? ref = titre –

Questions connexes