c# - 如何为类或类列表生成构造函数依赖图?
问题描述
我想生成一个文本输出列表,该列表遍历一个类或类列表的构造函数依赖项。我想我会以某种方式使用反射来做到这一点?并防止循环依赖。
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)
作为起点,但我以前只使用过属性,所以不知道下一步该做什么。
我想我会以某种方式需要获取构造函数参数,它们的类型,然后获取实际的实现并重复,以某种方式确保如果我有任何循环依赖项我不会陷入循环。不知道该怎么做,所以我们将不胜感激。
解决方案
您遇到的问题源于您使用的是 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 容器而异,但同样,大多数更成熟的库都包含这些类型的功能。
推荐阅读
- angular - 为什么 Angular 调用我的函数……几十次?
- jenkins - 在多个阶段之间重用 Jenkins 中的代理(docker 容器)
- ssl - 旧 TLS1.0 客户端无法连接到自定义域上的 Google App Engine
- c++ - 在静态库(C++、Eclipse CDT)中使用#ifdef
- networkx - 如何更改使用 holoviews/bokeh 绘制的 networkx 图中的颜色?
- c++11 - c++ popen 使应用程序停止 30 秒
- sql - 在 T-SQL 中设置等于计数的列
- c++ - 在 decltype 中使用命名空间
- android - 重用具有多个片段的单个 ViewModel。MvvmCross Android
- rust - 关联类型超特征的别名