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(对象发送者,EventArgs e)+85

更新
将问题库缩小到 Db4objects.Db4o.Linq.dll 一旦我将这个库作为引用(甚至不是“使用”,只是添加到引用中)在我的 mvc web 应用程序中引用的一个库中,我得到上面提到的YSOD。所有其他 Db4o 库都可以正常工作。

METTRE À JOUR
尝试将 UnityServiceLocator 与 WindsosServiceLocator 和 NinjectServiceLocator 交换。完全相同的结果,因此问题很可能不是源自任何一个库。

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

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

关于在哪里以及如何调试它的任何想法?

4

4 回答 4

3

为了写下正确的答案。我认为您收到了由未能加载 Db4objects.Db4o.Linq 引用的程序集触发的 TypeLoadException。

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

这些程序集是:

  • 莫诺·塞西尔
  • 塞西尔流量分析

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

于 2009-12-05T12:34:38.493 回答
2

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

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

于 2009-12-06T06:10:21.020 回答
0

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

  1. 删除所有服务注册并一次尝试一个以确定导致问题的类型。
  2. 确保您可以自己成功实例化目标类型。
  3. 验证目标类型没有任何其他未在您的服务注册中考虑的依赖项。

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

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

添加对 MvcTurbine.Ninject.dll 的引用

然后:

public class MvcApplication : TurbineApplication
{
    static MvcApplication()
    {
        //ServiceLocatorManager.SetLocatorProvider(() => new UnityServiceLocator());           
        ServiceLocatorManager.SetLocatorProvider(() => new NinjectServiceLocator()); 
    }
}
于 2009-12-03T16:29:03.657 回答
0

Jeff,MVC Turbine 目前仅支持 MVC 1.0,我正在为 .NET 3.5 和 .NET 4.0 获得 MVC 2.0 支持。请查看http://turbineproject.com了解它们何时发布。

于 2009-12-06T06:13:40.733 回答