Выполняет ли spring.net рекурсию подкаталогов?
-
06-09-2019 - |
Вопрос
Когда spring.net framework запускается для asp.net приложения, выполняет ли компонент, который регистрирует все объекты в контейнере IoC, рекурсию всех подкаталогов, на которые ссылаются в web.config?
например.
<spring>
<context>
<resource uri="~/bin/ClientService/ClientService.config"/>
<resource uri="~/MCFModule.config"/>
</context>
</spring>
Я полагаю, что ответ будет утвердительным, если посмотреть на вывод отладочной информации (прослушиватель трассировки).
Проблема, которую я вижу, заключается в том, что при попытке создать экземпляр в каталоге '\bin\ clientservice' выдается сообщение об ошибке, даже если dll существует в подкаталоге;
'Не удалось загрузить файл или сборку 'log4net, версия=1.2.10.0, Культура = нейтральная, PublicKeyToken=1b44e1d426115821' или одну из его зависимостей.Система не может найти указанный файл.'
У кого-нибудь есть какие-нибудь идеи?
Ваше здоровье
Олли
Решение
У вас также есть возможность программно обрабатывать сбои загрузки сборки, используя
AppDomain.AssemblyResolve
событие в классе AppDomain.
Вы могли бы, например, просканировать все подкаталоги в поисках нужной вам сборки.
Другие советы
Когда Spring.NET пытается разрешить ссылку в своем файле конфигурации, он будет использовать то же самое Правила в качестве .Загрузчик СЕТЕВОЙ сборки.Так что, возможно, вы могли бы попробовать добавить правильную ссылку на сборку log4net в свою папку bin.
Редактировать:Если вам нужен Spring.NET для размещения сборок в нестандартных местах вы могли бы использовать <assemblyBinding> элемент для указания местоположения:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="spring">
<section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/>
<section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" />
</sectionGroup>
</configSections>
<spring>
<context>
<resource uri="config://spring/objects"/>
</context>
<objects xmlns="http://www.springframework.net">
<object id="someObject" type="log4net.Util.AppenderAttachedImpl, log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821" />
</objects>
</spring>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="log4net"
publicKeyToken="1b44e1d426115821"
culture="neutral" />
<codeBase version="1.2.10.0
href="file:///c:/some_special_location/log4net.dll" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
И тогда вы могли бы попросить контейнер создать экземпляр объекта:
var someObject = ContextRegistry.GetContext().GetObject("someObject");