c# - 温莎城堡 - 跟踪注入给定对象的确切实例?
问题描述
我正在使用温莎绑定类似的东西
Component.For<ISomeInterface>().ImplementedBy<SomeService>().LifestyleSingleton();
对于特定的单元测试,我想弄清楚哪些特定的依赖项被注入到 SomeService 中,或者(递归地)注入到它的任何依赖项中。(对于上下文 - 我需要测试是否有任何绑定到另一个服务的实现,称为 IAnotherService,如果注入到涉及 ISomeInterface 的依赖链中,则属于特定的实现类型)。想象一下
我的问题归结为:给定一个实例(或一个 ComponentModel,如果这样更容易的话),我如何才能确定 Windsor 将哪些特定对象实例注入给定服务?
我尝试了大致类似的东西
static void RecursivelyCheck(ComponentModel component)
{
if(component.Services.Any(x => x == typeof(IAnotherService))
// ... do sanity checks ...
foreach(var child in component.Dependens.Cast<ComponentModel>())
RecursivelyCheck(child);
}
var service = kernel.GraphNodes.Single(x => ((ComponentModel)x).Implementation == typeof(SomeService);
foreach(var child in service.Dependends.OfType<ComponentModel>())
RecursivelyCheck(child);
这几乎可以工作.. 除了它没有,因为我使用自定义 ISubDependencyResolver 来解决一些具有非标准行为的依赖关系,在这种情况下, ComponentModel 并不能真正反映实际正在解决的问题。
所以我真正需要的是一些本着
void Check(object instance) {
if(instance is IAnotherService foo)
DoSomeSeriousTestingOn(foo);
foreach(var component in IWishWindsorHadThis.GetDependenciesInjectedInto(instance))
Check(component);
}
Check(kernel.Resolve<ISomeInterface>());
有没有办法做到这一点?
解决方案
推荐阅读
- git - 从 Bitbucket 克隆存储库后,终端会在未跟踪文件中显示上一个目录中的所有文件
- java - java AQS如何支持不公平锁?
- html - Bootstrap4 HTML 页面在移动设备上太大
- html - 活动选项卡时刷新页面
- reactjs - 带参数的 useQuery 时反应查询 useMutation
- html - 材质旋转木马不在材质网格内渲染
- macros - 如何使用 Scheme 中的语法规则从 List 创建 Alist?
- node.js - 将项目的节点版本从 v6x 更新到 v12x
- android - 导航视图的菜单项无法导航到各自的目的地
- flutter - 我想通过添加dependencis在我的其他flutter应用程序中导入我自己的flutter包(上传到私人git服务器上)但它不起作用