首页 > 解决方案 > 温莎城堡 - 跟踪注入给定对象的确切实例?

问题描述

我正在使用温莎绑定类似的东西

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

有没有办法做到这一点?

标签: c#dependency-injectioncastle-windsor

解决方案


推荐阅读