Web 应用程序实例性能因依赖注入而受到影响

Web app instancing performance hit with dependency injection

我有一个 asp.net mvc 应用程序,其中很多事情都取决于了解网络请求的 url(它是多租户)。目前,HttpContext 正在使用 Simple Injector 注入许多构造函数(通过基于上下文设置一些变量的包装器)。这意味着大多数事情必须实例化 "per web request" 而不是每个应用程序。

现在我在这里可以做的只是在方法中传递 HttpContext 包装器,或者只传递所需的数据,而不是构造函数注入。

我想知道的是实际性能差异。因为它确实让必须始终通过 wrapper/data 变得不那么优雅。然而,这是一个流量很高的网站,所以我一定会考虑改变它。

我确实意识到这有点取决于构造函数中发生的事情,但假设它所做的只是分配依赖项。

澄清一下,我没有遇到具体的性能问题。这只是优化,我想知道是否值得通过重构来实现这一点。

我很想坚持使用构造函数注入,因为它清楚地显示了依赖关系。的确,性能可能会受到很小的影响,因为您必须使用每个 Web 请求,并且与将上下文作为参数传递相比,这将涉及更多的垃圾收集。但是,这已经成为问题了吗?

如果您发现这是一个性能问题,您可以考虑第三种选择,前提是您的租户数量不是很多。您可以实例化并重新使用一个单例池 类,其中每个租户配置一个。

我已经构建了一个多租户站点并且需要为每个 Web 请求创建某些服务,并且在该领域绝对没有性能问题。

您可以在两者之间放置一个提供者,而不仅仅是一个包装器,您可以是单例,这使得所有消费者也可以是单例。

像这样:

public interface IHttpContextProvider
{
    HttpContext CurrentContext { get; }
}

public class HttpContextProvider : IHttpContextProvider
{
    public HttpContext CurrentContext => HttpContext.Current;
}

public interface IMyContextWrapper
{
    string CurrentRoute { get; }
}

public class MyContextWrapper : IMyContextWrapper
{
    private readonly IHttpContextProvider httpContextProvider;

    public MyContextWrapper(IHttpContextProvider httpContextProvider)
    {
        this.httpContextProvider = httpContextProvider;
    }

    public string CurrentRoute 
    {
        get
        {
            var context = this.httpContextProvider.CurrentContext;
            return informationFromContext;
        } 
    }
}