2008-11-25 5 views
1

J'ai une application client riche qui utilise Castle Windsor. Pour l'instant tous les assemblages y compris l'application exe sont dans le même dossier mais tout semble plutôt désordonné. Je voudrais placer mes dlls dans un sous-dossier tel que "bin" mais ceci empêche Château de localiser des types etc. quand appelé. En fait, l'application se bloque au démarrage.Can Castle Windsor peut-il localiser des fichiers dans un sous-répertoire?

Existe-t-il un moyen de dire à Castle de chercher ailleurs les fichiers?

Répondre

1

Cela dépend de la façon dont vous configurez le Windsor. Si vous utilisez l'interface Castle.MicroKernel.Registration, vous devez charger les assemblages manuellement, puis enregistrer les types chargés dans le conteneur.

1

Castle n'effectue aucun chargement lui-même, il repose simplement sur la fusion pour localiser l'assemblage en fonction de son comportement de sondage par défaut - il s'agit donc plutôt d'une question générale .Net Framework. Une façon de faire ce que vous voulez est de gérer l'échec de la résolution de l'assemblage et de diriger l'exécution vers l'emplacement de l'assemblage - une façon d'y parvenir est de surcharger la résolution de l'assemblage (voir msdn pour plus de détails) et d'écrire code pour localiser et charger l'assembly approprié à partir de l'emplacement correct. Cela vous permettra évidemment de prendre en charge n'importe quel type de schéma de répertoire, pas seulement un sous-répertoire binaire (vous pourriez par exemple avoir un répertoire séparé pour les plugins).

0

Vous pouvez utiliser un XmlInterpreter personnalisé pour initialiser votre conteneur. Créez une classe qui hérite de XmlInterpreter et placez la substitution suivante dans cette classe: Celle-ci traite tous * .dll.config dans le répertoire de l'assembly en cours d'exécution, qui peut facilement être réécrit pour utiliser une recherche de fichier récursive quelconque.

public override void ProcessResource(Castle.Core.Resource.IResource source, Castle.MicroKernel.IConfigurationStore store) 
{ 
    base.ProcessResource(source, store); 
    var baseDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 
    foreach(var extraConfig in Directory.GetFiles(baseDir, "*.dll.config")) 
    { 
     try 
     { 
      var interpreter = new XmlInterpreter(extraConfig) { Kernel = Kernel }; 
      interpreter.ProcessResource(interpreter.Source, store); 
     }      
     catch(ConfigurationErrorsException) 
     { 
      throw; 
     } 
     catch(Exception ex) 
     { 
      throw new InvalidOperationException("Failed to load configuration: " + extraConfig, ex); 
     } 
    } 
} 
+0

Ce code est seulement pour le chargement de la configuration autant que je peux dire ... il ne charge aucun assemblage –

Questions connexes