首页 > 解决方案 > 如何为类或类列表生成构造函数依赖图?

问题描述

我想生成一个文本输出列表,该列表遍历一个类或类列表的构造函数依赖项。我想我会以某种方式使用反射来做到这一点?并防止循环依赖。

https://stackoverflow.com/a/29704045/254257这似乎是我想要的,但他们没有提供代码。这个问题在类似的轨道上,但他们只是假设你从一个字典开始,你的依赖关系已经被概述为字符串。所以我想我将如何开始。

说我有以下内容:

public class UserService(IGroupService groupService, ILoggingService loggingService)
public class GroupService(IUserService userService, IRoleService roleService, ILoggingService loggingService)
public class RoleService(ILoggingService loggingService)

我想要一些代码输出如下内容:

用户服务

----GroupService

--------UserService CIRCULAR DEPENDENCY(停止深入)

--------角色服务

------------LoggingService

--------LoggingService

----日志服务

如果我只想检查对 UserService 的依赖关系,以及接口的实际具体实现。

我知道我可以var type = typeof(UserService)作为起点,但我以前只使用过属性,所以不知道下一步该做什么。

我想我会以某种方式需要获取构造函数参数,它们的类型,然后获取实际的实现并重复,以某种方式确保如果我有任何循环依赖项我不会陷入循环。不知道该怎么做,所以我们将不胜感激。

标签: c#reflectiondependency-injectionsystem.reflection

解决方案


您遇到的问题源于您使用的是 DI 容器这一事实。使用Pure DI时出现此类问题的可能性要小得多,因为在这种情况下,C# 编译器将验证对象构造,并且实际上不可能获得这种循环依赖。

当您使用 DI 容器时,请确保您使用的 DI 容器允许检测循环依赖关系并传达有意义的错误。事实上,任何成熟的 DI 容器都可以非常清楚地传达循环依赖错误。如果您选择的 DI 容器确实抛出堆栈溢出异常,请考虑切换到成熟的容器。

例如, Simple Injector将抛出异常并显示以下消息:

配置无效。创建 IGroupService 类型的实例失败。GroupService 类型直接或间接依赖于自身。循环图包含以下类型:GroupService -> UserService -> GroupService。

换句话说,Simple Injector 显示循环图如下:

组服务-> 用户服务-> 组服务

所以你真的不需要可视化对象图,事实上大多数容器都无法做到这一点,因为循环依赖。如果您的对象图是非循环的,当您使用 Visual Studio 调试器钻取容器时,Simple Injector 将按如下方式可视化该图:

在此处输入图像描述

或者您可以通过编程方式使用 Simple Injector 的 API 来实现相同的目的:

var graph = container.GetRegistration(typeof(UserService)).VisualizeObjectGraph();

这导致以下文本:

UserService(
    GroupService(
        RoleService(
            LoggingService()),
        LoggingService()),
    LoggingService())

请注意,您的里程可能会因其他 DI 容器而异,但同样,大多数更成熟的库都包含这些类型的功能。


推荐阅读