Может ли Castle Windsor найти файлы в подкаталоге? - PullRequest
1 голос
/ 25 ноября 2008

У меня полнофункциональное клиентское приложение, которое использует Castle Windsor. На данный момент все сборки, включая exe приложения, находятся в одной папке, но все выглядит довольно неопрятно. Я хотел бы поместить мои dll в подпапку, такую ​​как «bin», но это препятствует тому, чтобы Касл определял типы и т.д. при вызове. На самом деле приложение вылетает при запуске.

Есть ли способ сказать Каслу искать файлы в другом месте?

Ответы [ 3 ]

1 голос
/ 01 декабря 2008

Castle не выполняет загрузку сборок сам по себе, он просто полагается на fusion, чтобы найти сборку, основываясь на ее поведении при проверке по умолчанию - так что это более общий вопрос .Net Framework.

Один из способов сделать то, что вы хотите, - это обработать ошибку разрешения сборки и направить среду выполнения туда, где может быть сборка - один из способов добиться этого - переопределить разрешение сборки (подробнее см. msdn ). ), а затем напишите некоторый код, чтобы найти и загрузить соответствующую сборку из правильного расположения.

Это, очевидно, позволит вам поддерживать любую схему каталогов, а не только двоичный подкаталог (так что вы можете, например, иметь отдельный каталог для плагинов).

1 голос
/ 25 ноября 2008

Это зависит от того, как вы настраиваете Виндзор.

В случае использования интерфейса Castle.MicroKernel.Registration, вы должны загрузить сборки вручную и затем зарегистрировать загруженные типы в контейнере.

0 голосов
/ 16 февраля 2009

Вы можете использовать пользовательский XmlInterpreter для инициализации вашего контейнера. Создайте класс, который наследует XmlInterpreter, и поместите следующее переопределение в этот класс: Он обрабатывает все файлы * .dll.config в каталоге текущей исполняемой сборки, которые легко можно переписать для использования какого-либо рекурсивного поиска файлов.

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 );
        }
    }
}
...