我尝试添加一个测试,验证项目中的所有MVC控制器是否都可以成功解析。 我得到了
MvcControlleractionlist = asm.GetTypes()
.Where(type => typeof (System.Web.Mvc.Controller).IsAssignableFrom(type));
在测试中,我尝试用以下方法解决它们:
foreach (var mvcController in MvcControlleractionlist)
{
Container.Resolve(mvcController);
}
我得到的错误是:
InnerException = {" PerRequestLifetimeManager只能在HTTP请求的上下文中使用。导致此错误的可能原因是在非ASP.NET应用程序上使用生命周期管理器,或者在与相应同步无关的线程中使用它...
我假设后台的MVC使用PerRequestLifetimeManager注册所有控制器。如何让MVC认为测试在HTTP请求中运行?
答案 0 :(得分:0)
解决方案不是解析控制器,而是遍历构造函数的依赖项。
protected virtual List<TypeStruct> GetTypesToResolveFromClassType(Type classType)
{
var typeToResolves = new List<TypeStruct>();
var constructors = classType.GetConstructors();
foreach (ConstructorInfo constructorInfo in constructors)
{
var parameterInfos = constructorInfo.GetParameters();
foreach (ParameterInfo parameterInfo in parameterInfos.Where(t => t.ParameterType.IsInterface || t.ParameterType.IsAbstract))
{
DependencyAttribute dependencyAttribute = (DependencyAttribute)Attribute.GetCustomAttribute(parameterInfo, typeof(DependencyAttribute));
var type = parameterInfo.ParameterType;
typeToResolves.Add(new TypeStruct { type = type, DependencyName = dependencyAttribute?.Name });
}
}
return typeToResolves;
}