IIS池回收上的ASP.NET API DI(简单注入器)空引用

IIS池回收上的ASP.NET API DI(简单注入器)空引用,asp.net,iis,asp.net-web-api,dependency-injection,simple-injector,Asp.net,Iis,Asp.net Web Api,Dependency Injection,Simple Injector,我之前发布了另一个问题,但经过一些观察,我已经缩小到可能是什么导致了我的问题。基本上,一旦IIS应用程序池被回收,我的依赖项注入(最终通过创建一个nWatch应用程序扫描一些DLL)就会失败。INWatchApplication是Web API项目的依赖项 以下是Global.asax的内容: protected void Application_Start() { AreaRegistration.RegisterAllAreas(); GlobalConfiguration.

我之前发布了另一个问题,但经过一些观察,我已经缩小到可能是什么导致了我的问题。基本上,一旦IIS应用程序池被回收,我的依赖项注入(最终通过创建一个nWatch应用程序扫描一些DLL)就会失败。INWatchApplication是Web API项目的依赖项

以下是Global.asax的内容:

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    GlobalConfiguration.Configure(WebApiConfig.Register);
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);

    var webApiContainer = new Container();
    webApiContainer.Options.DefaultScopedLifestyle = new WebApiRequestLifestyle();
    RegisterTypes(webApiContainer);
    webApiContainer.RegisterWebApiControllers(GlobalConfiguration.Configuration);
    webApiContainer.Verify();

    GlobalConfiguration.Configuration.DependencyResolver =
        new SimpleInjectorWebApiDependencyResolver(webApiContainer);
}

private void RegisterTypes(Container container)
{
    var virtualPath = HostingEnvironment.ApplicationVirtualPath.Substring(1);
    string baseName = null;

    if (!string.IsNullOrEmpty(virtualPath)) {
        baseName = HostingEnvironment.SiteName + "_" + virtualPath;
    } else {
        baseName = HostingEnvironment.SiteName;
    }

    var nWatchApp = new NWatchEntityApplication(GetNWatchConfig());
    Trace.Listeners.Add(new DevOps.Diagnostics.DevOpsLogTraceListener(baseName));
    container.RegisterSingleton<INWatchApplication>(nWatchApp);
    container.Register<NWatchDbContext>(() => nWatchApp.GetDbContext(), Lifestyle.Scoped);
}

private INWatchConfiguration GetNWatchConfig()
{
    Configuration rootConfig =
        System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration(HostingEnvironment.ApplicationVirtualPath);
    return new NWatchSystemConfiguration(rootConfig);
}
受保护的无效应用程序\u Start()
{
RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
var webApiContainer=新容器();
webApiContainer.Options.DefaultScopedLifestyle=新的WebApiRequestLifestyle();
注册类型(webApiContainer);
WebapicContainer.RegisterWebapicController(GlobalConfiguration.Configuration);
webApiContainer.Verify();
GlobalConfiguration.Configuration.DependencyResolver=
新的SimpleInjectorWebApidencyResolver(WebApicContainer);
}
专用无效注册表类型(容器)
{
var virtualPath=HostingEnvironment.ApplicationVirtualPath.Substring(1);
字符串baseName=null;
如果(!string.IsNullOrEmpty(virtualPath)){
baseName=HostingEnvironment.SiteName+“”+virtualPath;
}否则{
baseName=HostingEnvironment.SiteName;
}
var nWatchApp=新的NWatchEntityApplication(GetNWatchConfig());
添加(新的DevOps.Diagnostics.DevOpsLogTraceListener(baseName));
集装箱登记单(nWatchApp);
container.Register(()=>nWatchApp.GetDbContext(),lifesture.Scoped);
}
私有INWatchConfiguration GetNWatchConfig()
{
配置根配置=
System.Web.Configuration.WebConfiguration Manager.OpenWebConfiguration(HostingEnvironment.ApplicationVirtualPath);
返回新的NWatchSystemConfiguration(rootConfig);
}
我读过各种博客和帖子,讨论动态加载的DLL似乎是一个问题,因为当IIS回收池时,它们不会复制到AppDomain。(我可能完全错了,但这是我的怀疑)

如何确保可能已加载的所有DLL(当应用程序首次部署到IIS时)即使在回收后仍可供应用程序使用?

var assemblies=BuildManager.getReferenceAssemblys().Cast();
var assemblies = BuildManager.GetReferencedAssemblies().Cast<Assembly>();
放在Global.asax应用程序的内部\u Start()似乎已经解决了这个问题