似乎当我安装了Simple Injector MVC3集成包时,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
看来应用程序正在尝试在Entity Framework甚至意识不到自己的上下文并且无法正确解析连接字符串之前加载上下文?
最佳答案
似乎该应用程序正在尝试加载上下文之前
实体框架甚至意识到其自身的特性,并且无法正常运行
解析连接字符串?
你是绝对正确的。在预应用程序启动阶段会自动调用SimpleInjectorInitializer.Initialize
方法。尽管此时配置容器没有问题,但是在您的情况下,现在调用Verify()
还为时过早。 Verify
简单地迭代所有注册并对其调用GetInstance
来查看它是否可以创建它。但是,在应用程序生命周期的那一刻,无法创建Entity Framework对象上下文。我必须说,我认为EF框架对ASP.NET框架一无所知是很奇怪的,但是不幸的是,事实就是这样。
要解决此问题,您可以将Verify()
调用移动,也可以将完整的初始化移动到应用程序启动中的稍后时间。例如,您可以执行以下操作:
[assembly: WebActivator.PreApplicationStartMethod]
(顶行)。 SimpleInjectorInitializer.Initialize()
事件中,添加对Application_Start()
方法的调用。 完成此操作后,在预初始化状态之后完成对象图的初始化(尤其是验证)。
另一个选择是从
container.Verify();
方法中删除SimpleInjectorInitializer.Initialize
调用,因为这是杀死您的早期验证过程。但是,在这样做之前,请先阅读Verify the container’s configuration,以了解替代方法。为方便起见,SimpleInjector.MVC NuGet包使用
WebActivator.PreApplicationStartMethod
。它使程序包“正常工作”,而无需开发人员进行任何手动编码(当然,对容器进行接线除外)也可以使程序正常工作。但是由于在使用Entity Framework时这不起作用,因此我们将不得不重新考虑该策略。