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

5

我使用Unity容器来解决应用程序中的依赖关系。

这些依赖关系及其依赖关系(等等)在app.config中注册,因为我需要能够更改应用程序在生产中的行为。

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

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

我只需要检查默认构建配置,不考虑在现场站点上进行的更改。此外-我不想使用硬编码的Unity注册。

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

有没有更简单的方法来验证所有Unity注册都存在?

3个回答

2
我使用Unity时经常遇到这个问题。
你可以编写一个应用程序,使用反射获取构造函数参数。类似这样:ConstructorInfo.GetParameters(); 并递归地获取每个返回参数的构造函数参数。如果你将该列表设为不同,那至少会给你一个应该被注册的期望类型列表。
希望这有所帮助。

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));
        }
    }

1
相关:有没有办法在项目中自动检测哪些IoC绑定未被使用?例如,我可能已经在我的根组合中定义了IFileManager,但它在我的项目中根本没有被使用。有没有什么方法可以做到这一点? - Vin Shahrdar

1
关于此事,
我希望能够通过编程方式检查Unity类型注册是否正确(可能作为CI构建过程的一部分)。我的意思是,如果我解析某个类型的实例,我可以确信该类型的依赖项(通过构造函数注入)也已注册并将被解析。
我们在其中一个项目中遇到了相同的情况,最终编写了集成测试并阅读了Unity.config,然后查找以字符串形式输入的注册对象。与下面描述的方法非常相似 https://blogs.msdn.microsoft.com/miah/2009/04/03/testing-your-unity-xml-configuration/ 问题在于您必须同时维护注册和测试,但这是验证所有类型是否正确注册的唯一方法。
简单地将xml与预期值进行比较比在测试中重新注册所有类型(基于您的配置)并解析它们更有效。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接