Я пытаюсь реализовать (как кажется) чрезвычайно простой механизм внедрения зависимостей для .NET с использованием Reflection. Цель состоит в том, чтобы предоставить интерфейс для класса ServiceFactory и использовать отражение для определения доступных разработчиков этого интерфейса и выбора реализации на основе раздела App.config. Звучит достаточно просто.
Я выбрал путь, который заключается в использовании события после сборки каждого проекта реализации службы для копирования файла .dll реализации в папку «ServiceImplementations». Затем класс ServiceFactory просматривает эту папку, чтобы найти доступных действительных разработчиков интерфейса. Идея состоит в том, что, используя отражение, я должен иметь возможность загружать эту произвольную DLL и все ее зависимости исключительно в отражении во время выполнения. Это цель, которую я хочу достичь.
Где-то в процессе я нормально загружаю эти зависимости. Я могу проверить мои загруженные в настоящее время сборки с помощью var asmDomainAssemblies = AppDomain.CurrentDomain.GetAssemblies ()
Итак, я продолжаю сканирование Reflection и заканчиваю загрузкой зависимых сборок (в данном случае EntityFramework, загружаемых через NuGet, и System.Web.ApplicationServices, системного файла). Все хорошо и хорошо. Пока я не дойду до этой строки кода:
var serviceImplementationAssembly = CheckLoadedAssemblies(assemblyName); // This function loads the service implementation assembly and its dependencies
var appDomainAsm = AppDomain.CurrentDomain.GetAssemblies();
var implementationTypes = serviceImplementationNamespace.GetTypes(); // Exception here
В последней строке кода создается исключение ReflectionTypeLoadException. Это исключение содержит два LoaderExceptions (каждое FileNotFoundException) с сообщением:
Could not load file or assembly 'EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' or one of its dependencies. The system cannot find the file specified.":"EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Это очень странно. Если я проверю переменную asmDomainAsm выше, я вижу, что эта точная подпись сборки загружена в мой текущий домен приложения. Не понимаю, почему Reflection не распознает, что это одни и те же сборки, хотя я их загружал в разное время.
Заранее благодарю за помощь.
Assembly.LoadFrom
илиAssembly.LoadFile
? - person Mike Zboray   schedule 03.12.2012