3

好像我在安装 Simple Injector MVC3 Integration 包的时候,SimpleInjectorInitializer 放在了 App_Start 文件夹中。但是,当在 Initialize() 中调用 Verify() 方法时,它会在尝试获取实体框架对象上下文时产生此错误(我还提供了内部异常):

The supplied connection string is not valid, because it contains insufficient mapping or metadata information.
    InnerException: Unable to determine application context. The ASP.NET application path could not be resolved.
        InnerException: Exception has been thrown by the target of an invocation.
            InnerException: (Shown in browser) This method cannot be called during the application's pre-start initialization phase.

似乎我还必须将注册调用从 Global.asax.cs Application_Start() 移动到 SimpleInjectorInitializer 的 InitializeContainer() 方法。

我现在不完全确定该怎么做,但这个问题似乎与这个问题有点相关:升级到 Ninject 3.0.0-rc3 后的连接字符串异常

似乎应用程序正在尝试在实体框架甚至意识到它自己之前加载上下文并且无法正确解析连接字符串?

4

1 回答 1

2

似乎应用程序正在尝试在实体框架甚至意识到它自己之前加载上下文并且无法正确解析连接字符串?

你是绝对正确的。该SimpleInjectorInitializer.Initialize方法在预应用程序启动阶段自动调用。Verify()尽管此时配置容器没有问题,但在您的情况下,调用它还为时过早。Verify只需迭代所有注册并调用GetInstance它们以查看它是否可以创建它。然而,在应用程序的生命周期中,无法创建实体框架对象上下文。我必须说,我认为 EF 框架对 ASP.NET 框架一无所知,这很奇怪,但不幸的是它就是这样。

要解决此问题,您可以将Verify()调用或完全初始化移到应用程序启动的稍后时刻。例如,您可以执行以下操作:

  1. 删除SimpleInjectorInitializer.cs类的[assembly: WebActivator.PreApplicationStartMethod](顶行) 。
  2. 在全局 asax 事件中添加对该SimpleInjectorInitializer.Initialize()方法的调用。Application_Start()

完成此操作,对象图的初始化(尤其是验证)在预初始化状态之后完成。

另一种选择是从方法中删除container.Verify();调用SimpleInjectorInitializer.Initialize,因为早期验证过程正在扼杀你。但是,请先阅读此验证容器的配置,以查看替代方案,然后再执行此操作。

为方便起见,SimpleInjector.MVC NuGet 包使用WebActivator.PreApplicationStartMethod。它允许包“正常工作”,而无需开发人员进行任何手动编码(当然连接容器除外)来使其工作。但由于这在使用实体框架时不起作用,我们将不得不重新考虑这个策略。

于 2012-07-11T05:18:22.537 回答