我在尝试理解在Application_Start期间(通过IoC容器)初始化的DbContext会发生什么时遇到问题。
该应用程序是一个MVC4,EF使用存储库,Unity作为IoC容器。 Global.asax
:
protected void Application_Start()
{
// usual MVC init code, routes, bundles etc.
var container = Bootstrapper.Initialise();
ViewEngines.Engines.Clear();
var ve = container.Resolve<AreaAwareRazorEngine>();
ViewEngines.Engines.Add(ve);
}
AreaAwareRazorEngine
不在容器中注册。该引擎需要使用DbContext来完成它的工作。这里的Repo和DbContext似乎被实例化为单身,从某种意义上来说,这是预期的。
DbContext在Unity中注册了PerRequestLifetimeManager
,因此在正常浏览网站时,它会在提供请求时被创建和处理。
我遇到的问题是,在elmah日志文件中我可以看到很多与通常的“DbContext已被处理......”相关的错误,我猜测会发生的事情是GC可能(在某些条件)执行传递并处理单例存储库+ DbContext。
我正在考虑的一个解决方案是将ViewEngine注册放在Application_BeginRequest
中,但是我想问一下社区这是一个好习惯还是以后会引起问题。我无法在本地测试内容,因为一切正常并且问题仅在部署到生产时(如果可以在IIS级别更改,则会引发问题)。