Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 依赖项注入对Web应用实例性能的影响_C#_Asp.net_Asp.net Mvc_Dependency Injection_Simple Injector - Fatal编程技术网

C# 依赖项注入对Web应用实例性能的影响

C# 依赖项注入对Web应用实例性能的影响,c#,asp.net,asp.net-mvc,dependency-injection,simple-injector,C#,Asp.net,Asp.net Mvc,Dependency Injection,Simple Injector,我有一个asp.NETMVC应用程序,其中很多东西都依赖于知道web请求的url(它是多租户的)。目前,HttpContext正在使用Simple Injector注入到许多构造函数中(通过一个基于上下文设置一些变量的包装器)。这意味着大多数东西必须是“每个web请求”而不是每个应用程序的实例 现在我可以做的是在方法中传递HttpContext包装器,或者只传递所需的数据,而不是构造函数注入 我想了解的是实际的性能差异。因为总是要传递包装器/数据,这确实让它变得不那么优雅。然而,这是一个相当高的

我有一个asp.NETMVC应用程序,其中很多东西都依赖于知道web请求的url(它是多租户的)。目前,HttpContext正在使用Simple Injector注入到许多构造函数中(通过一个基于上下文设置一些变量的包装器)。这意味着大多数东西必须是“每个web请求”而不是每个应用程序的实例

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

我想了解的是实际的性能差异。因为总是要传递包装器/数据,这确实让它变得不那么优雅。然而,这是一个相当高的交通站点,所以我肯定会考虑改变它。

我确实意识到这在一定程度上取决于构造函数中发生了什么,但假设它所做的只是分配依赖项


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

我会坚持使用构造函数注入,因为它清楚地显示了依赖性。的确,可能会对性能造成小的影响,因为您必须使用每个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;
        } 
    }
}

您是否
HttpContext
-wrapper包含数据,或在调用属性或方法时检索数据的逻辑?如果是后者,则不需要为每个web请求实例化;您可以使用一个实例(因为它将使用HttpContext.Current幕后),所以您要说的是,您是。我这里缺少数字和事实。这是假设的还是您有性能问题?你量过了吗?您是否分析过它以找出问题所在?我很想在没有这些信息的情况下结束这个问题。@Steven我添加了一段关于优化的说明。@Maarten包装器基于HttpContext设置了一堆东西,因此我无法拥有一个包装器实例。我添加了一个编辑,说明这主要是一个优化问题,我没有具体的性能问题。当然,我理解。这就是为什么我建议做代码中最自然的事情,而不是在没有问题的地方进行优化。是的,我更喜欢构造函数注入,但我更想寻找性能差异的答案。除非此提供程序的使用者包含状态,而不仅仅是逻辑。是的,我认为这不适合我,因为我根据上下文在包装器中设置了一堆东西。因此,我必须在每次使用时进行设置,我希望避免这种情况。在这种情况下,来自@Steven的评论适用,而您是,这是您当前工作的基础problem@Ric.Net好的,谢谢你的提醒。我想我会重新设计。尽管如此,关于性能的问题还没有真正得到答案……我知道我应该尝试一下并测量一下,但所需的重构并非无关紧要。我没有回答关于性能的问题,因为您没有提供关于实际性能问题的信息。简单的喷油器速度非常快,所以除了设计问题之外,您可能根本没有性能