Почему типы из сборок не могут быть разрешены Castle Windsor

Виндзорский замок не может разрешить какие-либо типы после регистрации их Ассамблеей.

Я пытаюсь реализовать службу, которая сканирует текущую библиотеку для всех расширений '.ddl', а затем регистрирует их с помощью сборки в Castle Windsor, но когда я пытаюсь разрешить, выдается исключение с сообщением: 'Нет компонента для поддержки службы' . Если я прохожу через Kernel.GetAssignableHandlers, я вижу, что все типы зарегистрированы.

1. получить корневое имя сборки:

var delimiterIndex = assembly.FullName.IndexOfAny(new[] { '.' });

2. Получить все сборки в виде массива

return Directory.EnumerateFiles(AppDomain.CurrentDomain.BaseDirectory, "*.*", SearchOption.AllDirectories)
                       .Where(x => Path.GetExtension(x).Equals(".dll", StringComparison.InvariantCultureIgnoreCase))
                         .Where(x => Path.GetFileName(x)
                            .StartsWith(rootAssemblyName, StringComparison.InvariantCultureIgnoreCase)).Select(Assembly.LoadFile).ToArray();

3. Зарегистрируйте каждую сборку в контейнере Виндзорского замка

Classes.FromAssembly(assembly).Pick().WithServiceBase().WithServiceAllInterfaces().WithServiceSelf().LifestyleTransient()

4. Разрешить

var instance = _container.Resolve<IFoo>();

При разрешении исключения ComponentNotFoundException выдается сообщение:

'Компонент для поддержки сервиса Mes.Utils.DBUpgrade.IDBUpgrader не найден'


person Martin    schedule 17.04.2019    source источник
comment
Я бы предпочел не использовать этот подход (найти реализацию с помощью поиска по множеству dll), вместо этого я бы зарегистрировал конкретную реализацию для каждого интерфейса. Если это сложно реализовать, представьте себе проблемы для устранения производственных проблем, если они возникнут.   -  person Renat    schedule 17.04.2019
comment
Возможно ли, что вы зарегистрировали все типы, с которыми вам напрямую нужно работать, но один из них зависит от IDBUpgrader, который не зарегистрирован? Можете ли вы разрешить другие типы из сборки?   -  person Scott Hannen    schedule 17.04.2019
comment
Вы сделали отличное замечание. Я попытался запустить и ResolveAll (typeOf (object)), который вызвал неудовлетворенное исключение в Custom Exception из-за строкового аргумента в конструкторе. Исключение типа Expception из регистрации позволяет мне успешно вызвать Resolve all on type объекта, и если выполнить итерацию по возвращаемому массиву и вызвать GetType (), будут возвращены правильные типы, но если я попробую одно решение, он все еще терпит неудачу. Если есть неподтвержденные зависимости, не будет ли исключение выброшено вверх?   -  person Martin    schedule 17.04.2019
comment
Массив сборки заполнен, через отладчик можно увидеть, что в контейнере есть зарегистрированные типы и нет неудовлетворенных зависимостей. Но я думаю, что попробую Classes.FromAssemblyInDirectory (), честно говоря, я пропустил это в документации   -  person Martin    schedule 18.04.2019


Ответы (1)


Мне так и не удалось найти настоящую ошибку в реальном коде, но Кшиштоф Козьмич предложил использовать Classes.FromAssemblyNamed вместо Classes.FromAssembly, что отлично работает: D

Таким образом, изменение исходного кода по сравнению с показанным в разделе 3 выглядит следующим образом: Classes.FromAssemblyNamed(assembly.FullName).Pick().WithServiceBase().WithServiceAllInterfaces().WithServiceSelf().LifestyleTransient().

Я предполагаю, что проблема заключалась в том, как я загрузил сборки, но Castle Windsor удалось загрузить их, вероятно

Спасибо всем за ответы и обсуждения в комментариях: D

person Martin    schedule 25.04.2019