Autofac Dependency Resolver在控制器解析mvc 5时遇到意外崩溃(DependencyResolutionException)

时间:2014-10-25 09:00:33

标签: dependency-injection repository asp.net-mvc-5 autofac constructor-injection

我有以下问题,我在mvc5中有web应用程序,具有autofac依赖注入和通用数据存储库。通常一切正常,网络运行没有错误,但一段时间后在线跟随错误出现: enter image description here

依赖项解析程序如下:

public class IoCConfig {
  public static IContainer BuildContainer < T > () {
    ContainerBuilder builder = new ContainerBuilder();

    builder.RegisterApiControllers(typeof(T).Assembly);
    builder.RegisterControllers(typeof(T).Assembly);

    try {
      foreach(var type in AssemblyLoader.Load < IDependency > ()) {
        var registration = builder.RegisterType(type);
        foreach(var interfaceType in type.GetInterfaces().Where(itf => typeof(IDependency).IsAssignableFrom(itf))) {
          registration = registration.As(interfaceType);

          if (typeof(IUnitOfWorkDependency).IsAssignableFrom(interfaceType)) {
            registration = registration.InstancePerRequest();
          }
        }
      }
    } catch (Exception ex) {
      throw ex;
    }

    return builder.Build();
  }
}

并在Application_Start上执行。

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

[Authorize]
public class ClassesManagmentController: Controller {
  IDepartmentsRepository _departmentRepo;
  IClassesRepository _classesRepo;
  IClassesCategoriesRepository _classesCategoriesRepo;

  public ClassesManagmentController(IDepartmentsRepository departmentsRepo,
    IClassesRepository classesRepo,
    IClassesCategoriesRepository classesCatiegoriesRepo) {
    _departmentRepo = departmentsRepo;
    _classesRepo = classesRepo;
    _classesCategoriesRepo = classesCatiegoriesRepo;
  }

  // the rest of the Controller code

}

示例repo界面和类是:

public class ClassesCategoriesRepository: Bases.RepositoryBase < ClassesCategoryDto > , IClassesCategoriesRepository {
  public ClassesCategoriesRepository(IContextFactory factory): base(factory) {

  }
}

public interface IClassesCategoriesRepository: IGenericRepository < ClassesCategoryDto > , IDependency {}

存储库位于专用项目中,依赖项解析程序和标识接口(IDependency)位于专用项目中,而Web又位于另一个项目中。

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

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

如果某些工作正常工作然后停止工作,则可能是IIS正在回收应用程序池,并且您的程序集扫描机制无法正确获取所有程序集。 Per the documentation


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

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

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

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


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