Autofac并不总能解析我的依赖关系

时间:2017-04-21 19:14:31

标签: c# asp.net-mvc dependency-injection autofac

当我在Visual Studio 2013 Professional开发环境中构建项目时,我的控制器中的存储库有时都是null,因为autofac无法正确解析它们。大约30%的时间都会发生这种情况。

以下是我使用的Autofac初始化代码:

public class AutofacConfig
{
    public static void ConfigureAutofac()
    {
        var assemblies = AppDomain.CurrentDomain.GetAssemblies();
        var builder = new ContainerBuilder();
        builder.RegisterControllers(typeof(MvcApplication).Assembly);
        builder.RegisterSource(new ViewRegistrationSource()); 
        builder.RegisterFilterProvider();

        builder.RegisterAssemblyTypes(assemblies)
               .Where(t => t.Name.EndsWith("Repository"))
               .AsImplementedInterfaces()
               .InstancePerRequest();

        var container = builder.Build();
        DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
    }
}

大多数情况下,当我重新启动项目或退出并回来时,问题就解决了。

1 个答案:

答案 0 :(得分:4)

看起来您正在使用程序集扫描来加载依赖项。这是IIS的已知行为,它在Autofac文档中进行了解释:Why aren’t my assemblies getting scanned after IIS restart?

  

在IIS中托管应用程序时,所有程序集在应用程序首次启动时都会加载到AppDomain,但当IIS回收AppDomain时,程序集只会按需加载。

     

要避免此问题,请使用GetReferencedAssemblies()上的System.Web.Compilation.BuildManager方法来获取引用的程序集列表:

var assemblies = BuildManager.GetReferencedAssemblies().Cast<Assembly>();
     

这将强制将引用的程序集加载到AppDomain中,立即使它们可用于模块扫描。