是否可以在 Simple Injector 上设置超时

问题描述 投票:0回答:1

创建实例时是否可以在 Simple Injector 上设置超时?

例如,我过去在实例化 HTTPClient 时遇到了问题,并且基本 URL 是通过数据库中的查询收集的。而且这个 HTTPClient 是暂时的,所以有时数据库的响应速度没有我们预期的那么快。

我知道这是一个完全错误的方法,但它已被修复。但这是搜索这个主题的开始。

我花了很多时间试图找到根本原因。因此,如果我可以为 Simple Injector 设置超时来完成安装,它可能会在问题附近引发异常。

c# simple-injector
1个回答
0
投票

简单注入器没有内置任何东西可以让您“翻转开关”并设置超时。尽管 Simple Injector 非常灵活,任何人都可以添加这样的功能,但对我来说,这不应该让 DI 容器来管理。我什至发现不太可能有任何 DI 容器(有几十个)可以为你做到这一点(OOTB)。

相反,您可以更改注册以实施超时。这可以使用任务来完成,例如:

container.Register<HTTPClient>(() =>
{
    Task timeOutTask = Task.Delay(TimeSpan.FromSeconds(5));
    
    Task realTask = Task.Run(() =>
    {
        // Some possible long-running operation
    });

    Task completedTask = Task.WhenAny(timeOutTask, realTask).Result;

    bool hasTimedOut = completedTask != checkTask;

    if (hasTimedOut) throw new Exception("Time's up");
    return ...;
});

警告: 我对 .NET API 的这一部分并不抱有任何期望,因此上面关于如何取消任务的实现可能并不完整。你应该谷歌,检查斯蒂芬·克利里的博客文章,并在这里询问,以确保你得到了正确的实现。上面的代码仅作为如何解决此问题的示例。

您已经提到您知道这是一个坏主意,但我真的想强调这确实是一个坏主意。对于任何可能在几年后阅读本文的人。对象组合必须快速可靠。这意味着在解析时连接到数据库是一个坏主意。此类调用应移出之后完成的构建阶段。这可以通过惰性方式完成,例如首次使用服务时或启动后立即使用。无论您做什么,都应将 I/O 排除在构建对象图的阶段之外(当您调用

GetInstance
Resolve
时)。

© www.soinside.com 2019 - 2024. All rights reserved.