应用程序池回收后 Autofac 无法解决
Autofac Fails to Resolve after App Pool Recycle
我使用 Autofac 多年,从未见过这种行为:构建后,应用程序运行良好。 但是,在 应用程序池被回收后(我通过触摸 web.config 测试了这个),我得到一个 DependencyResolutionException:
None of the constructors found with 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' on type 'Namespace.Controllers.HomeController' can be invoked with the available services and parameters
HomeController 有一个依赖项,它有其他依赖项,等等。但我知道它可以 解决它们,因为它在回收之前就解决了。到底为什么会这样???
我像这样自动装配所有东西:
public static IContainer GetAutoFacContainer()
{
var builder = new ContainerBuilder();
var assembliesToRegister = AppDomain.CurrentDomain.GetAssemblies()
.Where(a => a.FullName.StartsWith("Prefix")).ToArray();
builder.RegisterAssemblyTypes(assembliesToRegister)
.AsImplementedInterfaces().AsSelf().PropertiesAutowired().InstancePerLifetimeScope();
return builder.Build();
}
然后我将容器用于 WebAPI 和 MVC 控制器。
var autoFacContainer = DependencyRegistrar.GetAutoFacContainer();
DependencyResolver.SetResolver(new AutofacDependencyResolver(autoFacContainer));
GlobalConfiguration.Configuration.DependencyResolver =
new AutofacWebApiDependencyResolver(autoFacContainer);
感谢 Steven 上面的评论,我确实找到了另一个问题以及 Autofac 网站的答案。我不知道为什么这些从未出现在我的研究中。
http://docs.autofac.org/en/latest/faq/iis-restart.html
解决方案
改变AppDomain.CurrentDomain.GetAssemblies()
到BuildManager.GetReferencedAssemblies().Cast<Assembly>()
完成!
我使用 Autofac 多年,从未见过这种行为:构建后,应用程序运行良好。 但是,在 应用程序池被回收后(我通过触摸 web.config 测试了这个),我得到一个 DependencyResolutionException:
None of the constructors found with 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' on type 'Namespace.Controllers.HomeController' can be invoked with the available services and parameters
HomeController 有一个依赖项,它有其他依赖项,等等。但我知道它可以 解决它们,因为它在回收之前就解决了。到底为什么会这样???
我像这样自动装配所有东西:
public static IContainer GetAutoFacContainer()
{
var builder = new ContainerBuilder();
var assembliesToRegister = AppDomain.CurrentDomain.GetAssemblies()
.Where(a => a.FullName.StartsWith("Prefix")).ToArray();
builder.RegisterAssemblyTypes(assembliesToRegister)
.AsImplementedInterfaces().AsSelf().PropertiesAutowired().InstancePerLifetimeScope();
return builder.Build();
}
然后我将容器用于 WebAPI 和 MVC 控制器。
var autoFacContainer = DependencyRegistrar.GetAutoFacContainer();
DependencyResolver.SetResolver(new AutofacDependencyResolver(autoFacContainer));
GlobalConfiguration.Configuration.DependencyResolver =
new AutofacWebApiDependencyResolver(autoFacContainer);
感谢 Steven 上面的评论,我确实找到了另一个问题以及 Autofac 网站的答案。我不知道为什么这些从未出现在我的研究中。
http://docs.autofac.org/en/latest/faq/iis-restart.html
解决方案
改变AppDomain.CurrentDomain.GetAssemblies()
到BuildManager.GetReferencedAssemblies().Cast<Assembly>()
完成!