Турбина с db4objects.db4o.linq.dll дает невозможно загрузить одно или несколько из запрошенных типов исключением
-
12-09-2019 - |
Вопрос
В моем приложении ASP.NET-MVC я пытаюсь настроить турбину.
Код инициализации выглядит следующим образом:
public class MvcApplication : TurbineApplication
{
static MvcApplication()
{
ServiceLocatorManager.SetLocatorProvider(() => new UnityServiceLocator());
}
}
и тогда у меня есть набор регистраторов, сравнимый со следующим:
public class UserRepositoryRegistration : IServiceRegistration
{
public void Register(IServiceLocator locator)
{
locator.Register<IUserRepository, Db4oUserRepository>();
}
}
Если я попытаюсь запустить, я получаю следующую ошибку где -то после SetLocatorProvider, но перед тем, как ввести какой -либо из методов регистра:
Ошибка сервера в приложении '/'
Невозможно загрузить один или несколько запрашиваемых типов. Получить свойство LoadEREXCEPTIONS для получения дополнительной информации.
Описание: Неизвестное исключение произошло во время выполнения текущего веб -запроса. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где он возник в коде.
Детали исключения: System.Reflection.ReflectionTypeloadexception: невозможно загрузить один или несколько из запрошенных типов. Получить свойство LoadEREXCEPTIONS для получения дополнительной информации.
Ошибка источника: невозможное исключение было сгенерировано во время выполнения текущего веб -запроса. Информация о происхождении и местоположении исключения может быть идентифицирована с использованием трассировки стека исключений ниже.
Трассировки стека:
[ReflectionTypeLoadException: Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.] System.Reflection.Module._GetTypesInternal(StackCrawlMark& stackMark) +0 System.Reflection.Assembly.GetTypes() +105 MvcTurbine.ComponentModel.DefaultAutoRegistrator.AutoRegister(ServiceRegistration serviceRegistration) +338 MvcTurbine.Web.RotorContext.ProcessAutomaticRegistration(AutoRegistrationList registrationList) +155 MvcTurbine.Web.RotorContext.AutoRegistrationForContext() +163 MvcTurbine.Web.RotorContext.Turn() +37 MvcTurbine.Web.TurbineApplication.ExecuteContext() +43 MvcTurbine.Web.TurbineApplication.TurnRotor() +65 MvcTurbine.Web.TurbineApplication.Application_Start(Object sender, EventArgs e) +85
ОБНОВИТЬ
Сузил библиотеку проблем до db4objects.db4o.linq.dll, как только у меня появится эта библиотека в качестве ссылки (даже не «использование», просто добавленные к ссылкам) в одной из моих библиотек, на которые ссылается в моем MVC WebPplication, я получаю Выше упомянутый ysod. Все остальные библиотеки DB4O работают просто отлично.
Mettre à Jour
Попробовал обмениваться UnityServiceLocator с WindsosserviceLocator и NinjectServiceLocator. Точно так же результаты, так что, скорее всего, проблема не возникает ни на одной из либеров.
Опкдадинг
Чтобы воссоздать страницу ошибки. Достаточно сделать следующие шаги:
- Создайте новое приложение MVC (не имеет значения, версия Wat)
- ALTER GLOABAL.ASAX.CS для использования MVCTURBINE и добавления необходимых MVCTURBINE LIBS
Вы найдете, что все еще работает, как и ожидалось - Добавить db4objects.db4o.dll
Все еще все работает - Добавить db4objects.db4o.linq.dll
Ysod
Есть идеи о том, где и как отладить это?
Решение
Ради записи правильного ответа. Я думаю, что вы получаете TypelOadexception, вызванную неспособностью загрузить сборку, на которую ссылается db4objects.db4o.linq.
Глядя на это в ILDASM, показывает, что ему требуются следующие сборки, которые поставляются с DB4O (используйте те же сборки, которые поставлялись с db4objects.db4o.linq, чтобы избежать какого -либо несоответствия).
Эти собрания:
- Mono.cecil
- Cecil.flowanalysis
Для записи, ABD на сегодняшний день, они используются оптимизатором запроса LINQ для DB4O для анализа доступа к свойствам в запросах LINQ.
Другие советы
Чтобы турбина могла зарегистрировать ваши типы, она должна иметь сборку хостинга (db4objects.db4o.linq) и любые другие сборки, на которые может ссылаться сборка хостинга.
Трассировка стека в вашем исходном посте гласит, что при попытке разрешить типы для вашего приложения, что не удалось разрешить, чего в этом случае его нет.
Звучит как проблема с вашим целевым типом. Вы можете попробовать следующее:
- Удалите все регистрации услуг и попробуйте их по одному, чтобы определить тип, который вызывает проблему.
- Убедитесь, что вы можете успешно создать целевой тип самостоятельно.
- Убедитесь, что целевой тип не имеет никаких других зависимостей, которые не учитываются в регистрации ваших услуг.
Было бы полезно увидеть объявление и конструктор (ы) типа целевого типа.
Попробуйте переключиться на другой контейнер IOC:
Добавьте ссылку на mvcturbine.ninject.dll
Затем:
public class MvcApplication : TurbineApplication
{
static MvcApplication()
{
//ServiceLocatorManager.SetLocatorProvider(() => new UnityServiceLocator());
ServiceLocatorManager.SetLocatorProvider(() => new NinjectServiceLocator());
}
}
Джефф, MVC Turbine в настоящее время поддерживает только MVC 1.0, я нахожусь в процессе получения поддержки MVC 2.0 для .NET 3.5 и .NET 4.0. пожалуйста, проверьте http://turbineproject.com Для получения информации, когда они будут освобождены.