Question

Comment puis-je injecter la valeur d'une entrée appSettings (à partir de app.config ou web.config) dans un service utilisant le conteneur Windsor? Si je voulais injecter la valeur d'une propriété de Windsor dans un service, je ferais quelque chose comme ceci:

<properties>
    <importantIntegerProperty>666</importantIntegerProperty>
</properties>
<component
    id="myComponent"
    service="MyApp.IService, MyApp"
    type="MyApp.Service, MyApp"
    >
    <parameters>
        <importantInteger>#{importantIntegerProperty}</importantInteger>
    </parameters>
</component>

Cependant, ce que j'aimerais vraiment, c'est prendre la valeur représentée par # {importantIntegerProperty} à partir d'une variable de paramètres d'application qui pourrait être définie comme ceci:

<appSettings>
    <add key="importantInteger" value="666"/>
</appSettings>

MODIFIER: à clarifier; Je me rends compte que ce n’est pas nativement possible avec Windsor et les David Hayden L’article mentionné par sliderhouserules concerne en fait son propre conteneur IoC (David Hayden), pas celui de Windsor

Je ne suis sûrement pas la première personne à avoir ce problème, alors ce que j'aimerais savoir, c'est comment d'autres personnes ont-elles résolu ce problème?

Était-ce utile?

La solution

J'ai finalement trouvé une solution à ce problème, basée sur des indices provenant de différentes sources sur le Web. Le résultat final consistait cependant à copier pratiquement trois classes de Windsor et à les modifier un peu. Le résultat final est sur codeplex pour votre plaisir.

http://windsorappcfgprops.codeplex.com/

A l'origine, j'avais écrit ce code il y a quelque temps, donc il est basé sur Windsor 1.0.3 - oui, il m'a fallu que pour pouvoir publier le résultat!

Le code vous permet d'avoir ceci dans votre app.config (ou web.config, évidemment):

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="theAnswer" value="42"/>
  </appSettings>
</configuration>

... et y accéder à partir de votre fichier de configuration XML Windsor comme suit:

<?xml version="1.0" encoding="utf-8" ?>
<castle>
  <components>
    <component
      id="answerProvider"
      service="Acme.IAnswerProvider, Acme"
      type="Acme.AnswerProvider, Acme"
      >
      <parameters>
        <theAnswer>#{AppSetting.theAnswer}</theAnswer>
      </parameters>
    </component>
  </components>
</castle>

Il existe un exemple de travail dans la solution.

Autres conseils

J'ai écrit un message sur un cas similaire a il y a quelques mois. Il utilise un SubDependencyResolver pour injecter les paramètres appropriés. Dans votre cas, vous pouvez simplement modifier DynamicConfigurationSettings pour ConfigurationManager.

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