Турбина с Db4objects.Db4o.Linq.dll выдает Невозможно загрузить одно или несколько запрошенных типов исключений - PullRequest
0 голосов
/ 03 декабря 2009

В моем приложении asp.net-mvc я пытаюсь настроить Turbine.
Код инициализации выглядит следующим образом:

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

UPDATE
Сузили проблемную библиотеку до Db4objects.Db4o.Linq.dll Как только у меня есть эта библиотека в качестве ссылок (даже не «использующих», просто добавленных к ссылкам) в одной из моих библиотек, на которую ссылается мое веб-приложение mvc, я получаю вышеупомянутый YSOD. Все остальные библиотеки Db4o работают просто отлично.

METTRE À JOUR
Попытался обменять UnityServiceLocator с WindsosServiceLocator и NinjectServiceLocator. Точно такие же результаты, так что, скорее всего, проблема не возникает ни в одной из библиотек.

OPPDATERING
Для воссоздания страницы ошибки достаточно выполнить следующие шаги:

  • Создание нового приложения Mvc (не важно, какая версия)
  • Измените код gloabal.asax.cs для использования MvcTurbine и добавьте необходимые библиотеки MvcTurbine
    Вы найдете все по-прежнему работает, как ожидалось
  • Добавить Db4objects.Db4o.dll
    Все еще работает
  • Добавить Db4objects.Db4o.linq.dll
    YSOD

Есть идеи, где и как это отладить?

Ответы [ 4 ]

3 голосов
/ 05 декабря 2009

Ради записи правильного ответа. Я думаю, вы получаете исключение TypeLoadException, вызванное неудачей при загрузке сборки, на которую ссылается Db4objects.Db4o.Linq.

Просмотр в ildasm показывает, что для него требуются следующие сборки, поставляемые с db4o (используйте те же сборки, что и Db4objects.Db4o.Linq, чтобы избежать любого несоответствия).

Эти сборки:

  • Mono.Cecil
  • Cecil.FlowAnalysis

Что касается записи abd, то на сегодняшний день они используются оптимизатором запросов LINQ to db4o для анализа доступа к свойствам в запросах linq.

2 голосов
/ 06 декабря 2009

Чтобы Turbine регистрировал ваши типы, он должен иметь хост-сборку (Db4objects.Db4o.Linq) и ЛЮБЫЕ другие сборки, на которые может ссылаться хост-сборка.

Трассировка стека в исходном сообщении говорит, что при попытке разрешить типы для вашего приложения что-то не удалось разрешить, чего в данном случае нет.

0 голосов
/ 06 декабря 2009

Джефф, MVC Turbine в настоящее время поддерживает только MVC 1.0, я нахожусь в процессе получения поддержки MVC 2.0 для .NET 3.5 и .NET 4.0. Пожалуйста, проверьте http://turbineproject.com для информации, когда они будут выпущены.

0 голосов
/ 03 декабря 2009

Похоже, проблема с вашим типом цели. Вы можете попробовать следующее:

  1. Удалить все сервисные регистрации и попробуй их по одному, чтобы определить тип, который вызывает проблема.
  2. Убедитесь, что вы можете успешно создать экземпляр типа цели сами.
  3. Убедитесь, что целевой тип не есть другие зависимости, которые не учитывается в вашем обслуживании регистрация.

Было бы полезно увидеть объявление и конструктор (ы) целевого типа (ов).

Попробуйте переключиться на другой контейнер IoC:

Добавить ссылку на MvcTurbine.Ninject.dll

Тогда:

public class MvcApplication : TurbineApplication
{
    static MvcApplication()
    {
        //ServiceLocatorManager.SetLocatorProvider(() => new UnityServiceLocator());           
        ServiceLocatorManager.SetLocatorProvider(() => new NinjectServiceLocator()); 
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...