Turbina com Db4objects.Db4o.Linq.dll fornece exceção Não é possível carregar um ou mais dos tipos solicitados

StackOverflow https://stackoverflow.com/questions/1839241

Pergunta

No meu aplicativo asp.net-mvc, estou tentando configurar o Turbine.
O código de inicialização é o seguinte:

public class MvcApplication : TurbineApplication
{
    static MvcApplication()
    {
        ServiceLocatorManager.SetLocatorProvider(() => new UnityServiceLocator());           
    }
}

e tenho então um conjunto de registradores comparável ao seguinte:

public class UserRepositoryRegistration : IServiceRegistration
{
    public void Register(IServiceLocator locator)
    {
        locator.Register<IUserRepository, Db4oUserRepository>();
    }
}

Se eu tentar executar, recebo o seguinte erro em algum lugar após SetLocatorProvider, mas antes de inserir qualquer um dos métodos de registro:

Erro de Servidor na '/' Aplicação.

Não foi possível carregar um ou mais dos tipos solicitados.Recupere a propriedade LoaderExceptions para obter mais informações.

Descrição:Ocorreu uma exceção não tratada durante a execução da solicitação da web atual.Revise o rastreamento de pilha para obter mais informações sobre o erro e sua origem no código.

Detalhes da exceção:System.Reflection.ReflectionTypeLoadException:Não foi possível carregar um ou mais dos tipos solicitados.Recupere a propriedade LoaderExceptions para obter mais informações.

Erro de origem:Uma exceção não tratada foi gerada durante a execução da solicitação web atual.As informações sobre a origem e localização da exceção podem ser identificadas usando o rastreamento de pilha de exceções abaixo.

Rastreamento de pilha:

    [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

ATUALIZAR
Reduzi a biblioteca de problemas para db4Objects.db4o.linq.dll assim que eu tiver essa biblioteca como uma referência (nem mesmo "usando", apenas adicionada às referências) em uma das minhas bibliotecas que são mencionadas na minha aplicação de web MVC, eu recebo o acima mencionado ysod.Todas as outras bibliotecas Db4o funcionam perfeitamente.

METTRE À JOUR
Tentei trocar o UnityServiceLocator pelo WindsosServiceLocator e pelo NinjectServiceLocator.Exatamente os mesmos resultados, então é mais provável que o problema não se origine em nenhuma das bibliotecas.

OPDATERING
Para recriar a página de erro basta seguir os seguintes passos:

  • Crie um novo aplicativo Mvc (não importa qual versão)
  • Altere o código gloabal.asax.cs para usar MvcTurbine e adicione as bibliotecas MvcTurbine necessárias
    Você descobrirá que tudo ainda funciona conforme o esperado
  • Adicionar Db4objects.Db4o.dll
    Ainda tudo funciona
  • Adicionar Db4objects.Db4o.linq.dll
    YSOD

Alguma idéia de onde e como depurar isso?

Foi útil?

Solução

Para escrever uma resposta adequada.Acho que você está recebendo uma TypeLoadException acionada por uma falha ao carregar um assembly referenciado por Db4objects.Db4o.Linq.

Examinar isso no ildasm mostra que ele requer os seguintes assemblies fornecidos com o db4o (use os mesmos assemblies que acompanham o Db4objects.Db4o.Linq para evitar qualquer incompatibilidade).

Essas assembleias são:

  • Mono.Cecil
  • Cecil.FlowAnálise

Para registro, a partir de hoje, eles são usados ​​pelo otimizador de consulta LINQ to db4o para analisar o acesso às propriedades em consultas linq.

Outras dicas

Para que o Turbine registre seus tipos, ele precisa ter o assembly de hospedagem (Db4objects.Db4o.Linq) e QUALQUER outro assembly que o assembly de hospedagem possa fazer referência.

O rastreamento de pilha em sua postagem original diz que, ao tentar resolver os tipos do seu aplicativo, algo não foi resolvido, o que neste caso não está presente.

Parece um problema com o seu tipo de alvo.Você pode tentar o seguinte:

  1. Remova todos os registros de serviço e tente um de cada vez para determinar o tipo que está causando o problema.
  2. Certifique -se de que você possa instanciar com sucesso o tipo de destino sozinho.
  3. Verifique se o tipo de destino não possui outras dependências que não são contabilizadas nos registros de serviço.

Seria útil ver a declaração e o(s) construtor(es) do(s) tipo(s) de destino.

Tente mudar para outro contêiner IoC:

Adicione uma referência a MvcTurbine.Ninject.dll

Então:

public class MvcApplication : TurbineApplication
{
    static MvcApplication()
    {
        //ServiceLocatorManager.SetLocatorProvider(() => new UnityServiceLocator());           
        ServiceLocatorManager.SetLocatorProvider(() => new NinjectServiceLocator()); 
    }
}

Jeff, MVC Turbine atualmente suporta apenas MVC 1.0, estou no processo de obter suporte MVC 2.0 para .NET 3.5 e .NET 4.0.por favor, verifique http://turbineproject.com para obter informações sobre quando serão lançados.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top