应用程序池回收后,Autofac无法解决

时间:2016-09-27 22:37:29

标签: asp.net-mvc asp.net-web-api dependency-injection autofac ioc-container

我已经使用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);

1 个答案:

答案 0 :(得分:3)

感谢上面的Steven评论,我确实找到了另一个问题以及Autofac网站的答案。为什么这些从未出现在我的研究中我不知道。

http://docs.autofac.org/en/latest/faq/iis-restart.html

解决方案

更改AppDomain.CurrentDomain.GetAssemblies()

BuildManager.GetReferencedAssemblies().Cast<Assembly>()

完成!