验证Unity的MVC控制器DI注册

时间:2018-01-08 17:32:02

标签: c# asp.net-mvc dependency-injection unity-container

我尝试添加一个测试,验证项目中的所有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请求中运行?

1 个答案:

答案 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;
    }
相关问题