我继承了一个MVC,该MVC当前使用ApplicationStart方法进行一些设置工作,因此当应用程序通过IIS应用程序池恢复工作时,该设置已经完成。
作为伪代码:
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
// Build Api autofac container
// Build MVC autofac container
// Resolve serviceOne from the MVC container
var serviceOne = (IServiceOne)DependencyResolver.Current.GetService(typeof(IServiceOne));
// Make setup call - includes external http calls and DbContext checking
serviceOne.syncToExternal();
// Resolve serviceTwo again from the MVC container
var serviceTwo = (IServiceTwo)DependencyResolver.Current.GetService(typeof(IServiceTwo));
// Make setup call - publishes application information to internal message queues so that we know it's running
serviceTwo.syncToInternalSystems();
}
}
在ApplicationStart中,我将完成设置Autofac容器的常规过程;一个用于MVC,另一个用于WebApi。在这里分别注册了MVC或Api控制器,服务类和我的DbContext。
ApplicationStart中的设置工作需要一个服务和一个DbContext(我从MvcContainer解析),因为此时无法访问WebApi。
ServiceOne
从外部URL检索数据,并使用它来播种/检查数据库的当前内容。
ServiceTwo
读取一些数据并将其发布到公司内部的消息队列中。
Application_Start()
完成并且主页已加载后:如果我请求通过MVC进行路由,则DbCobntext的注册数据库Initialzer不会像在Application_Start期间运行时那样被调用,但是如果/api
请求的dataInitializer确实被调用。
我怀疑在ApplicationStart方法中运行安装程序会阻止在管理连接的System.Data.Entity.Database中设置标志;因此,当从Api容器解析DbContext时,它认为数据库尚未初始化...?
任何帮助将不胜感激。
我的后退方法是将所有设置转换为种子方法,该方法在调用databaseInitialiser / Migration时运行;但了解为什么原始代码未能按预期执行将很有用。