2009-01-29 11 views
6

Comment gérez-vous les types primitifs lors de l'utilisation d'un conteneur IoC?Types primitifs et conteneurs IoC

I.e. étant donné que vous avez:

class Pinger { 
    private int timeout; 
    private string targetMachine; 

    public Pinger(int timeout, string targetMachine) { 
     this.timeout = timeout; 
     this.targetMachine = targetMachine; 
    } 

    public void CheckPing() { 
     ... 
    } 
} 

Comment obtiendriez-vous les arguments constructeur int et string?

+0

Bonne question! – Stimul8d

Répondre

4

Créez une autre interface pour cela.

Ensuite, vous obtiendrez quelque chose comme:

public Pinger(IExtraConfiguration extraConfig) 
{ 
    timeout = extraconfig.TimeOut; 
    targetmachine = extraconfig.TargetMachine; 
} 

Je ne sais pas d'autres conteneurs du CIO, mais le château de Windsor résout ces paramètres du constructeur supplémentaires automatiquement.

+0

Cela ne résout pas le problème d'une part, et il ajoute de la complexité de l'autre. Nous devons reconnaître que l'IoC va parfois déformer votre code de manière non naturelle avec des conséquences négatives. Si vous avez besoin de construire un Ordre avec une variété de types de Cupcake, vous devrez injecter une instance et la muter avec des appels de méthode (forte odeur). Vous pouvez injecter un contexte, mais comment est-il configuré de manière dynamique lors de l'exécution? Vous devez muter cela aussi. Il est temps de sortir la tête du sable et d'accepter les verrues avec la beauté indiscutable de l'IoC. –

1

Cela dépend. IoC-Container StructureMap vous permettra de déclarer ces dépendances lorsque vous configurerez l'instance au début de votre exécution.

par exemple. dans un registre

ForRequestedType<Pinger>() 
    .TheDefault.Is.OfConcreteType<Pinger>() 
    .WithCtorArg("timeout").EqualTo(5000) 
    .WithCtorArg("targetMachine").EqualToAppSetting("machine"); 
1

Au printemps, on peut rechercher des valeurs de propriété à partir d'un fichier de propriétés en utilisant la notation $ {propertyName}

<bean class="blah.Pinger"> 
    <constructor-arg value="${blah.timeout}"/> 
    <constructor-arg value="${blah.targetMachine}"/> 
</bean> 

En Spring.net la même fonctionnalité est fournie par le PropertyPlaceholderConfigurer, qui a la même syntaxe, et utilise des sections de valeur de nom dans les fichiers de configuration.

3

Je ne sais pas si votre difficulté est le type de valeur ou le type de béton. Aucun n'est un problème. Vous n'avez pas besoin d'introduire une interface de configuration (c'est utile si vous voulez passer les mêmes paramètres à plusieurs objets, mais pas dans le cas que vous avez donné). Quoi qu'il en soit, voici le code de Windsor, je suis sûr que quelqu'un soumettra bientôt une version XML.

container.Register(
      Component.For(typeof(Pinger)) 
       .ImplementedBy(typeof(Pinger)) // This might not be necessary 
       .Parameters(Parameter.ForKey("timeout").Eq("5000"), 
          Parameter.ForKey("targetMachine").Eq("machine") 
       ) 
      );