首页 文章

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

提问于
浏览
0

在我的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:无法加载一个或多个请求的类型 . 检索LoaderExceptions属性以获取更多信息 . ]
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 webapplication中引用了我的一个库中的这个库作为引用(甚至不是"using",只是添加到引用)我得到上面提到的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

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

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

    那些集会是:

    • Mono.Cecil

    • Cecil.FlowAnalysis

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

  • 2

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

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

  • 0

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

    • 删除所有服务注册并一次尝试一个以确定导致问题的类型 .

    • 确保您可以自己成功实例化目标类型 .

    • 验证目标类型是否没有任何其他未在服务注册中考虑的依赖项 .

    查看目标类型的声明和构造函数会很有帮助 .

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

    添加对MvcTurbine.Ninject.dll的引用

    然后:

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

    Jeff,MVC Turbine目前只支持MVC 1.0,我正在进行中获得.NET 3.5和.NET 4.0的MVC 2.0支持 . 有关何时发布的信息,请查看http://turbineproject.com .

相关问题