我正在使用SimpleInjector并使用非常先进的注册技术,并且可能会使用一些扩展点来进行更多预付款注册(请参阅下面的动机)。这引发了编写单元测试的需要,该单元测试验证容器是否正确引导。例如,假设类型A1和& A2依赖于服务B,服务B由C1和C2实现,因此A1应注入C1,A2应注入C2。我想编写一个测试,用于验证不合格的A1在解析时注入C1,而A2注入C2。虽然我可以从A1和A2公开所有注入服务的公共属性来验证它们在测试中的类型,但我不是仅仅为了测试而这样做。是否有一个简单的API来测试如何解析对象图,也许是基于诊断API的东西,它似乎也是为了调试视图而做同样的事情?
动机:预付款注册背后的动机是通过基于注入上下文替换/装饰注入服务来实施设计和架构决策。这对我来说非常有利于保持应用程序代码的简单性和可测试性,将所有“if-then-else”复杂性放在容器注册级别中,并使应用程序代码保持真正的SOLID,同时几乎只对容器注册进行更改。这个想法的灵感来自于.Net Junkie关于命令&amp ;;的3个帖子。查询和装饰器的使用,以及基于编译时或运行时上下文应用某些装饰器的能力,这对于SOLID设计来说非常强大和有用。
答案 0 :(得分:2)
是否有一个简单的API来测试如何解析对象图,也许基于诊断API的东西似乎是为了调试视图而做同样的事情?
是的,有几种方法可以做到这一点。我想到的两个选项是VisualizeObjectGraph
上的GetRelationships
和InstanceProducer. Both allow visualizing object graphs.
方法GetRelationships gives you a structured graph that you can iterate over, while
VisualizeObjectGraph`以字符串格式返回对象图,类似于C#。
示例:
var container = new Container();
// Do registrations
// You need to verify to get the correct output of those methods
container.Verify();
var r = container.GetRegistration(typeof(A1));
Console.WriteLine(r.VisualizeObjectGraph());
这会输出类似
的内容A1(
FileLogger(
Dependency1(),
Dependency2()),
C1(
Dependency1(),
SomeService()));
使用GetRelationships()
时,您可以递归遍历图形并检查给定类型是否是注册的(子)依赖项。
示例:
// Useful extension method
private static IEnumerable<InstanceProducer> GetDependencies(this InstanceProducer p) {
foreach (var r in p.GetRelationships()) {
yield return r.Dependency;
foreach (var d in r.Dependency.GetDependencies()) {
yield return d;
}
}
}
var container = new Container();
// Do registrations
// You need to verify to get the correct output of those methods
container.Verify();
var deps = container.GetRegistration(typeof(A1)).GetDependencies();
Assert.IsTrue(deps.Any(p => p.Registration.ImplementationType == typeof(C1)));
请注意,尽管我认为您应该尽可能地限制这些类型的注册检查,因为: