C# 如何为特定请求选择一组单独的服务?

C# 如何为特定请求选择一组单独的服务?,c#,dependency-injection,simple-injector,C#,Dependency Injection,Simple Injector,我用的是简单的注射器,看起来效果不错。有一件事我很想做,但我不知道怎么做,或者如果可能的话,就是根据一些参数更改注册服务的列表 例如:如果我看到一个URL参数&debug=true,那么我想清除已注册服务的列表,并用模拟实现替换它们。这将使我的硒测试更容易 这可能吗?还是完全疯了?开箱即用,Simple Injector更喜欢构建事先完全已知的对象图。由于固定对象图更容易验证,因此缺少内置功能(允许您根据运行时变量构建不同的对象图)是故意的,这降低了构建对象图在运行时失败的可能性(在成功调用.v

我用的是简单的注射器,看起来效果不错。有一件事我很想做,但我不知道怎么做,或者如果可能的话,就是根据一些参数更改注册服务的列表

例如:如果我看到一个URL参数
&debug=true
,那么我想清除已注册服务的列表,并用模拟实现替换它们。这将使我的硒测试更容易


这可能吗?还是完全疯了?

开箱即用,Simple Injector更喜欢构建事先完全已知的对象图。由于固定对象图更容易验证,因此缺少内置功能(允许您根据运行时变量构建不同的对象图)是故意的,这降低了构建对象图在运行时失败的可能性(在成功调用
.verify()
之后)。除了可验证性,它还提高了性能

但是,尽管没有内置任何东西,仍然有许多方法可以根据运行时条件动态切换服务或整个对象图。我想到的三种可能性是使用和注册一个简单的代理

以下是代理注册的示例:

container.Register<IMailSender>(() => IsDebug(HttpContext.Current)
    ? container.GetInstance<MailSender>()
    : container.GetInstance<MockSender>());
container.Register(()=>IsDebug(HttpContext.Current)
?container.GetInstance()
:container.GetInstance());
<>但是,即使可能,你也可能想考虑一种不同的方法。例如,使用配置值而不是运行时值。这在您的情况下似乎非常合理,因为您是否希望能够同时使用生产环境进行web测试?我觉得不大可能。特别是因为在同一台服务器上部署第二个IIS web应用程序非常容易

因此,您可以为Selenium框架创建一个特殊的应用程序部署,该部署在web.config中包含一个值,该值为
,或者类似的值。现在,在composition root(引导容器的地方)中,您可以简单地执行以下操作:

bool debug = bool.Parse(ConfigurationManager.AppSettings["Debug"]);

if (debug) {
    container.Register<IMailSender, MockSender>();
    // more registrations here
} else {
    container.Register<IMailSender, MailSender>();
    // more registrations here
}
bool debug=bool.Parse(ConfigurationManager.AppSettings[“debug”]);
如果(调试){
container.Register();
//这里有更多的注册
}否则{
container.Register();
//这里有更多的注册
}

这允许在运行时修复对象图,同时仍然能够在部署过程中更改内容。

是否也要更改应用程序范围的服务?您可以插入一个解析器func,然后在参数中调用该func pass,然后获取模拟或真实实现的实例。