当我在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));
}
}
大多数情况下,当我重新启动项目或退出并回来时,问题就解决了。
答案 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
中,立即使它们可用于模块扫描。