C# Autofac不总是解析我的依赖项

C# Autofac不总是解析我的依赖项,c#,asp.net-mvc,dependency-injection,autofac,C#,Asp.net Mvc,Dependency Injection,Autofac,当我在Visual Studio 2013 Professional开发环境中构建项目时,有时控制器中的存储库都为空,因为autofac无法正确解析它们。这种情况大约有30%的时间发生 以下是我使用的Autofac初始化代码: public class AutofacConfig { public static void ConfigureAutofac() { var assemblies = AppDomain.CurrentDomain.GetAssembl

当我在Visual Studio 2013 Professional开发环境中构建项目时,有时控制器中的存储库都为空,因为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));
    }
}

大多数时候,当我重建项目或退出并返回项目时,问题已经解决

看起来您正在使用程序集扫描加载依赖项。这是IIS的已知行为,Autofac文档对此进行了解释:

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

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

var assemblies = BuildManager.GetReferencedAssemblies().Cast<Assembly>();
var assemblies=BuildManager.getReferencedAssemblys().Cast();
这将强制将引用的程序集加载到
AppDomain
中,使其立即可用于模块扫描


西里尔,谢谢你。这完全解决了我的问题。我只需要在我的案例结尾添加.ToArray(),但在过去的几周里,一切都很顺利。