2010-12-03 44 views
4

J'ai une application utilisant Autofac pour le moment. J'ai structuré mon autofac pour enregistrer à partir du fichier de configuration après les modules sont chargés. (Pour un remplacement basé sur XML du comportement par défaut). À l'heure actuelle, j'ai une classe avec un tas de paramètres environnementaux de base (un grand nombre de propriétés auto-publiques). Cette classe essaie de deviner la configuration par défaut en fonction de certains paramètres, mais l'idée est que chaque environnement dans lequel l'application s'exécute remplacerait ces paramètres dans la configuration xml.Configuration et propriétés XML Autofac Remplacer ou Fournir si non présent?

Voici mon problème:

Plus tôt dans le développement de ce système, les choses étaient Peachy. Maintenant il semble ignorer complètement l'entrée des XML Configs. Je ne suis pas sûr de ce qui a changé ce qui a causé que cela se brise, donc j'espère que quelqu'un peut signaler quelque chose d'évident que je fais mal.

J'ai vérifié que le fichier de configuration est lu/analysé par autofac, mais pas appliqué.

web.config:

<autofac> 
    <files> 
    <file name="Config/Environment.config" section="autofac-common" /> 
    <file name="Config/Environment.config" section="autofac-public" /> 
    </files> 
</autofac> 

Environment.config:

<configuration> 
    <configSections> 
    <section name="autofac-common" type="Autofac.Configuration.SectionHandler, Autofac.Configuration"/> 
    <section name="autofac-public" type="Autofac.Configuration.SectionHandler, Autofac.Configuration"/> 
    </configSections> 

    <!-- Common --> 
    <autofac-common> 
    <components> 
     <component type="MyApp.Web.Configuration.ServerConfiguration, MyApp.Web" 
      service="MyApp.Web.Configuration.IServerConfiguration, MyApp.Web"> 
     <properties> 
      <property name="Host" value="beta.mysite.com" /> 
      <property name="MediaHost" value="beta.media.mysite.com" /> 
     </properties> 
     </component> 
    </components> 
    </autofac-common> 
    <!-- Web Site --> 
    <autofac-public> 
    <modules> 
     <module type="MyApp.Configuration.CachingModule, MyApp"> 
     <properties> 
      <property name="Disable" value="true" /> 
     </properties> 
     </module> 
    </modules> 
    </autofac-public> 
</configuration> 

Building Container Code de

var builder = new ContainerBuilder(); 

    // Register Identifier so it's available to modules 
    builder.RegisterType<ServerIdentifier>() 
     .As<IServerIdentifier>() 
     .SingleInstance(); 
    var container = builder.Build(); 

    builder = new ContainerBuilder(); 
    builder.RegisterModule(new CachingModule() { Disable = true }); 
    builder.RegisterModule(new LoggerModule()); 
    builder.RegisterModule(new InventoryModule()); 
    builder.RegisterModule(new CatalogModule()); 
    builder.RegisterModule(new WebModule(container)); 

    // Override with settings from XML 
    builder.RegisterModule(new ConfigurationSettingsReader("autofac")); 

    builder.Update(container); 

Version Autofac est 2.3.2.632 Pour .NET 3.5

+0

Pourriez-vous nous montrer le code de construction de conteneurs? Aussi, quelle version d'Autofac utilisez-vous? –

+0

@Peter Lillevold: Mise à jour avec le code du bâtiment du conteneur. Aussi la version autofac incluse. Je suppose qu'avec les changements fréquents d'autofac et les changements constants de * rupture * il est plus important que les autres bibliothèques de connaître la version :) – Aren

+0

De quoi parlez-vous? –

Répondre

3

Le problème est dans votre <files> section. Étant donné que cela est géré par FileElementCollection, une classe de configuration héritant de la classe NamedConfigurationElementCollection et en utilisant la propriété name comme valeur de clé, plusieurs entrées doit avoir des valeurs uniques name.

Puisque vous faites référence au même name deux fois, la première entrée faisant référence à la section autofac-common est effectivement remplacée par la deuxième entrée. Ainsi, le service ne sera jamais enregistré, seul le CachingModule.

Je ne peux pas dire si c'est un nouveau comportement sur la partie Autofac ou non, autant que je peux dire de la source, la classe FileElementCollection a été introduite dans 2.0 et n'a pas changé de logique depuis lors. Serait-ce que vous avez référencé différents fichiers .config plus tôt?