使用Db4objects.Db4o.Linq.dll的Turbine使Unable无法加载一个或多个请求的类型异常

时间:2009-12-03 11:04:57

标签: c# asp.net-mvc unity-container db4o turbine

在我的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属性以获取更多信息。

     

描述:执行当前Web请求期间发生了未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

     

异常详细信息:System.Reflection.ReflectionTypeLoadException:无法加载一个或多个请求的类型。检索LoaderExceptions属性以获取更多信息。

     

来源错误:   在执行当前Web请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常的起源和位置的信息。

     

堆栈追踪:

    [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 webapplication中引用的一个库中有这个库作为引用(甚至不是“使用”,只是添加到引用),我就得到上面提到的YSOD。所有其他Db4o库都可以正常工作。

METTREÀJOUR
尝试使用WindsosServiceLocator和NinjectServiceLocator交换UnityServiceLocator。完全相同的结果,因此问题可能不会来自任何一个库。

OPPDATERING
要重新创建错误页面,只需执行以下步骤:

  • 创建新的Mvc应用程序(与wat版本无关)
  • 改变gloabal.asax.cs代码以使用MvcTurbine并添加所需的MvcTurbine库  你会发现一切仍然按预期工作
  • 添加Db4objects.Db4o.dll
     仍然一切正常
  • 添加Db4objects.Db4o.linq.dll
     YSOD

关于在何处以及如何调试此问题的任何想法?

4 个答案:

答案 0 :(得分:3)

为了写下正确的答案。我认为你是因为无法加载由Db4objects.Db4o.Linq引用的程序集而触发的TypeLoadException。

在ildasm中查看它表明它需要db4o附带的以下程序集(使用与Db4objects.Db4o.Linq一起提供的相同程序集以避免任何不匹配)。

这些集会是:

  • Mono.Cecil能做到
  • Cecil.FlowAnalysis

对于记录,abd截至今天,它们被LINQ to db4o查询优化器用于分析linq查询中的属性访问。

答案 1 :(得分:2)

为了让Turbine注册您的类型,它需要托管程序集(Db4objects.Db4o.Linq)和托管程序集可能引用的任何其他程序集。

原始帖子中的堆栈跟踪表示在尝试解析应用程序的类型时无法解决问题,在这种情况下它不存在。

答案 2 :(得分:0)

听起来像你的目标类型有问题。您可以尝试以下方法:

  1. 删除所有服务注册和 一次尝试一个来确定 造成这种情况的类型 问题。
  2. 确保您可以成功 实例化目标类型 自己。
  3. 验证目标类型不是 有任何其他依赖 没有考虑到你的服务 注册。
  4. 查看目标类型的声明和构造函数会很有帮助。

    尝试切换到另一个IoC容器:

    添加对MvcTurbine.Ninject.dll的引用

    然后:

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

答案 3 :(得分:0)

Jeff,MVC Turbine目前只支持MVC 1.0,我正在为.NET 3.5和.NET 4.0提供MVC 2.0支持。请查看http://turbineproject.com以获取有关何时发布的信息。