Dependency injection Autofac依赖项解析程序在解析mvc 5的控制器上局部崩溃(DependencyResolutionException)

Dependency injection Autofac依赖项解析程序在解析mvc 5的控制器上局部崩溃(DependencyResolutionException),dependency-injection,repository,asp.net-mvc-5,autofac,constructor-injection,Dependency Injection,Repository,Asp.net Mvc 5,Autofac,Constructor Injection,我有以下问题,我有mvc5中的web应用程序,带有autofac依赖项注入和通用数据存储库。通常情况下,一切正常,网络运行无误,但联机一段时间后出现以下错误: 依赖项解析程序如下所示: 公共类IoCConfig{ 公共静态IContainer BuildContainer(){ ContainerBuilder=新的ContainerBuilder(); 建造商。注册管理器(类型(T)。组装); 建造商。注册控制器(T型组件); 试一试{ foreach(AssemblyLoader.Load

我有以下问题,我有mvc5中的web应用程序,带有autofac依赖项注入和通用数据存储库。通常情况下,一切正常,网络运行无误,但联机一段时间后出现以下错误:

依赖项解析程序如下所示:

公共类IoCConfig{
公共静态IContainer BuildContainer(){
ContainerBuilder=新的ContainerBuilder();
建造商。注册管理器(类型(T)。组装);
建造商。注册控制器(T型组件);
试一试{
foreach(AssemblyLoader.Load()中的变量类型){
var registration=builder.RegisterType(类型);
foreach(type.GetInterfaces()中的var interfaceType,其中(itf=>typeof(IDependency).IsAssignableFrom(itf))){
注册=注册.As(interfaceType);
if(typeof(IUnitOfWorkDependency).IsAssignableFrom(interfaceType)){
注册=注册。InstancePerRequest();
}
}
}
}捕获(例外情况除外){
掷骰子;
}
返回builder.Build();
}
}
并在应用程序启动时执行

控制器的示例构造函数是:

[授权]
公共类类管理控制器:控制器{
IDepartmentsRepository\u departmentRepo;
IClasseResposition(类别报告);;
IClassesCategories还原性分类报告;
公共类管理控制员(IDepartmentsRepository departmentsRepo,
IClasseResposition classesRepo,
IClassesCategoriesRepository Classes(分类){
_departmentRepo=departmentsRepo;
_classesRepo=classesRepo;
_classesCategoriesRepo=classesCatiegoriesRepo;
}
//控制器代码的其余部分
}
示例回购接口和类为:

公共类ClasseScategories存储库:base.RepositoryBase,IClassesCategoriesRepository{
公共类类别存储库(IContextFactory工厂):基础(工厂){
}
}
公共接口IClassesCategoriesRepository:IGenericRepository,IDependency{}
存储库位于专用项目中,依赖项解析程序和标识接口(IDependency)位于专用项目中,web位于另一个项目中

我已经两次检查了我的解决方案的所有项目是否都引用相同的autofac和mvc库。我尝试了不同的解析类型,但还没有找到解决方案


任何帮助都将不胜感激。

如果事情运行了一段时间后停止工作IIS很可能正在回收应用程序池,而您的程序集扫描机制无法正确拾取所有程序集。:


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

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

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



如果此控制器从不工作但其他所有功能都工作,请在其中一个工作控制器中进行测试-尝试手动解析
IDepartmentsRepository
,然后查看是否可以。如果可以,那么。。。奇怪的事情正在发生。但是如果你不能,那就意味着特定的回购没有被扫描获取,也没有被注册,因此异常会告诉你到底出了什么问题。

非常感谢,在我使用程序集加载器之前,这个解决方案是完美的:var assembles=AppDomain.CurrentDomain.getassembles();使用您的解决方案,它可以像一个符咒一样工作,在本地IIS工作上发布3天,之前没有任何问题的迹象。再一次谢谢你