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;
}
}
}
我有一个 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;
}
}
}