我有以下问题,我在mvc5中有web应用程序,具有autofac依赖注入和通用数据存储库。通常一切正常,网络运行没有错误,但一段时间后在线跟随错误出现:
依赖项解析程序如下:
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库,我已经检查了两次。我正在尝试不同的解析类型,但我还没有找到解决方案。
任何帮助将不胜感激。
答案 0 :(得分:2)
如果某些工作正常工作然后停止工作,则可能是IIS正在回收应用程序池,并且您的程序集扫描机制无法正确获取所有程序集。 Per the documentation:
在IIS中托管应用程序时,所有程序集在应用程序首次启动时都会加载到AppDomain中,但当IIS回收AppDomain时,程序集只会按需加载。
要避免此问题,请使用GetReferencedAssemblies()
上的System.Web.Compilation.BuildManager
方法来获取引用的程序集列表:
var assemblies = BuildManager.GetReferencedAssemblies().Cast<Assembly>();
这将强制将引用的程序集加载到AppDomain
中,立即使它们可用于模块扫描。
如果此控制器永远无法正常工作,但其他一切工作正常,请在其中一个工作控制器中进行测试 - 尝试手动解析IDepartmentsRepository
并查看是否可以。如果可以,那么......奇怪的事情正在发生。但是,如果你不能,那么这意味着特定的回购没有被扫描拾取并且没有注册,所以异常就是告诉你到底出了什么问题。