以编程方式检查统一容器类型注册

时间:2016-05-10 08:27:02

标签: c# dependency-injection unity-container

我使用unity容器来解析应用程序中的依赖项。

依赖项及其依赖项(依此类推)已在app.config中注册,因为我需要能够更改应用程序在生产中的行为方式。

有时,错过了依赖项的类型注册,只有在应用程序的生命周期中解析了类型的实例时才会显示,这意味着可能只会出现问题在集成测试期间 - 这并不理想。

我希望能够以编程方式检查(可能作为CI构建过程的一部分)已正确进行统一类型注册。我的意思是,如果我解析一个类型的实例,我可以确信该类型的依赖项(通过构造函数注入)也已注册并将被解析。

我只需要检查默认的构建配置,在这里不考虑在实时网站上进行的更改。另外 - 我不想使用硬编码的统一注册。

我现在能想到的唯一方法是解析统一配置文件并尝试解析找到的类型的每个实例...

是否有更简单的方法来验证统一注册是否全部存在?

3 个答案:

答案 0 :(得分:2)

我使用团结并经常面对这个问题。

您可以编写一个使用反射来获取Constructor参数的应用程序。像这样的东西: ConstructorInfo.GetParameters();并递归获取每个返回参数的构造函数参数。如果您使该列表不同,那至少会为您提供一个应该注册的预期类型列表。

希望这有帮助。

答案 1 :(得分:2)

此单元测试似乎足以验证我的配置到目前为止。按照https://msdn.microsoft.com/en-us/library/dn507504(v=pandp.30).aspx的说明,我可以加载我的容器并验证所有注册都已解决。

    [TestMethod]
    public void TestContainer()
    {
        IUnityContainer container = new UnityContainer().LoadConfiguration();
        foreach (var registration in container.Registrations)
        {
            Assert.IsNotNull(container.Resolve(registration.RegisteredType, registration.Name));
        }
    }

答案 2 :(得分:1)

关于

  

我希望能够以编程方式检查(可能作为CI的一部分   建立过程)已经进行了统一类型注册   正确。我的意思是,如果我解决一个类型的实例,我   可以确信该类型的依赖关系(通过构造函数   注册)也已注册并将得到解决。

我们在其中一个项目中遇到了相同的情况,我们最终编写了集成测试并阅读了Unity.config,然后查找注册类型为object的对象。 与下面描述的方法非常相似 https://blogs.msdn.microsoft.com/miah/2009/04/03/testing-your-unity-xml-configuration/

这个问题是您必须同时维护注册和测试,但这是验证所有类型都已正确注册的唯一方法。

简单地将xml与预期值进行比较比重新注册所有类型(基于您的配置)并在测试中解析它们更有效。