代码之家  ›  专栏  ›  技术社区  ›  Woody1193 Nimmi Rashinika

预装配似乎不起作用

  •  0
  • Woody1193 Nimmi Rashinika  · 技术社区  · 6 年前

    我正在编写一个测试来检查Unity配置中的所有控制器是否正确注册。作为测试的一部分,我使用反射来检查从中继承的所有非抽象类 System.Web.Mvc.Controller System.Reflection.ReflectionTypeLoadException . 我觉得奇怪有两个原因:

    1. 我在文件的顶部有一个using语句,当测试运行时,该语句会自动加载这个特定的程序集。

    using System.Linq;
    using System.Reflection;
    using System.Text;
    using System.Web.Mvc;
    using Microsoft.VisualStudio.TestTools.UnitTesting;
    using Unity;
    
    namespace Presentation.Tests
    {
        [TestClass]
        public class UnityTests
        {
            [TestMethod]
            public void UnityRegistration_ControllersInitialize()
            {
                // Initialize the container the same way we do in the code
                // but make sure that the container is disconnected from the application
                // so we don't accidentally change runtime behavior through testing
                var container = UnityRegistration.Initialize(new UnityContainer());
    
                // Get all the controllers in the presentation layer so we can check whether or not
                // they can all be constructed at runtime
                Assembly.Load("System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35");
                var assembly = Assembly.ReflectionOnlyLoad("Presentation, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null");
                var ctrls = assembly.GetTypes()
                    .Where(t => t.IsAssignableFrom(typeof (Controller)) && !t.IsAbstract && t.IsClass);
    
                var builder = new StringBuilder();
                foreach (var ctrl in ctrls)
                {
                    // Check resolution on each type. If resolution fails or
                    // the result is null then we should record the error
                    bool isErr;
                    try
                    {
                        var obj = container.Resolve(ctrl);
                        isErr = obj == null;
                    }
                    catch
                    {
                        isErr = true;
                    }
    
                    if (isErr)
                    {
                        builder.AppendLine(string.Format("Controller of type {0} could not be resolved.", ctrl.Name));
                    }
                }
    
                string errors = builder.ToString();
                if (!string.IsNullOrWhiteSpace(errors))
                {
                    Assert.Fail(errors);
                }
            }
        }
    }
    

    请注意,引用 Controller 这里特指 System.Web.Mvc.控制器 .

    Cannot resolve dependency to assembly 'System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' because it has not been preloaded. When using the ReflectionOnly APIs, dependent assemblies must be pre-loaded or loaded on demand through the ReflectionOnlyAssemblyResolve event.

    有人能解释一下为什么预加载似乎不能以这种方式工作,我将如何正确地确保正确的程序集加载?

    1 回复  |  直到 6 年前
        1
  •  1
  •   apocalypse    6 年前

    来自Microsoft Docs :

    为其他平台或.NET的其他版本编译 框架。只能检查加载到此上下文中的代码;它 无法执行。这意味着无法创建对象,因为 无法执行构造函数。因为代码无法执行, 依赖项不会自动加载。如果你需要检查

    在你的代码里:

    var obj = container.Resolve(ctrl);
    

    你不能使用 ctrl 打字可以做任何事情,除了检查。不能创建任何依赖它的对象。

    推荐文章