我使用的是Simple Injector,它看起来效果很好。根据一些参数,我真的想做的一件事是,我不知道怎么做,或者如果可能的话,就是改变列表注册的服务。
例如:如果我看到一个URL参数&debug=true
,那么我想清除注册服务列表并用模拟实现替换它们。这将使我的硒测试更容易。
这可能吗?还是完全疯了?
答案 0 :(得分:2)
开箱即用,Simple Injector更喜欢预先完全知道的构建对象图。由于固定对象图更易于验证,因此缺少可让您根据运行时变量构建不同对象图的内置功能,这降低了在运行时构建对象图失败的可能性(在{{1}之后)被成功调用)。除了可验证性之外,它还可以提高性能。
但是虽然没有内置任何东西,但仍有很多方法可以根据运行时条件动态切换服务或整个对象图。我想到的三种可能性是使用context based injection,runtime decorators并注册一个简单的委托。
以下是委托注册的示例:
.Verify()
但即使有可能,您也可以考虑采用不同的方法。例如,使用配置值而不是使用运行时值。在您的情况下,这似乎非常合理,因为您是否希望能够同时使用您的生产环境进行Web测试?对我来说似乎不太可能。特别是因为在同一台服务器上部署第二个IIS Web应用程序非常容易。
因此,您可以为Selenium框架创建应用程序的特殊部署,并且此部署在web.config中包含container.Register<IMailSender>(() => IsDebug(HttpContext.Current)
? container.GetInstance<MailSender>()
: container.GetInstance<MockSender>());
或类似内容的值。现在,在组合根(您引导容器的地方)中,您可以简单地执行此操作:
<add key="Debug" value="True" />
这允许在运行时修复对象图,同时仍然可以在部署期间更改内容。