无法在SimpleInjectorInitializer中检索用于验证的实体框架对象上下文

时间:2012-07-10 23:33:44

标签: asp.net-mvc asp.net-mvc-3 dependency-injection ioc-container simple-injector

当我安装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()方法。

我不完全确定此时该做什么,但这个问题似乎与这个问题有些相关:Connection string exception after upgrading to Ninject 3.0.0-rc3

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

1 个答案:

答案 0 :(得分:2)

  

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

你是对的。在应用程序启动前阶段会自动调用SimpleInjectorInitializer.Initialize方法。虽然此时配置容器没有问题,但在您的情况下,调用Verify()为时尚早。 Verify只是迭代所有注册并在其上调用GetInstance以查看它是否可以创建它。但是,在应用程序生命周期的那一点上,无法创建实体框架对象上下文。我必须说我认为EF框架对ASP.NET框架有所了解是很奇怪的,但不幸的是它就是这样。

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

  1. 删除 SimpleInjectorInitializer.cs 类的[assembly: WebActivator.PreApplicationStartMethod](第一行)。
  2. 在全局asax的SimpleInjectorInitializer.Initialize()事件中添加对Application_Start()方法的调用。
  3. 执行此操作后,初始化(尤其是验证)对象图是在 pre-init状态后完成的。

    另一种选择是从container.Verify();方法移除SimpleInjectorInitializer.Initialize来电,因为这是早期的验证过程,会让您失望。但是,请先阅读此Verify the container’s configuration,以便在此之前查看备选方案。

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