C# 通过参数解决依赖关系-不预先实例化服务?

C# 通过参数解决依赖关系-不预先实例化服务?,c#,asp.net-core,C#,Asp.net Core,简单来说,我有一个简单的代码: services.AddScoped<IFruit>(provider => { var httpContext = provider.GetRequiredService<IHttpContextAccessor>().HttpContext; if (httpContext.Request.QueryString.HasValue)

简单来说,我有一个简单的代码:

    services.AddScoped<IFruit>(provider =>
        {
            var httpContext = provider.GetRequiredService<IHttpContextAccessor>().HttpContext;

            if (httpContext.Request.QueryString.HasValue)
            {
                return new AppleService(...);
            }
            else return new OrangeService(...);
        });
另外,我不想预先实例化这两个服务,只是为了决定要转到哪个服务

我希望实例化只针对我将要使用的服务。(根据请求参数)

然而,我在下面看到了一个很好的解决方案(使用工厂),但是正如您所看到的,他注入并实例化了两个服务,即使他只需要一个

(在我的场景中,我需要作用域实例化)

问题:


如何仅实例化每个请求参数所需的服务?

如果您将服务注册到DI容器中,然后使用
服务提供者来解决这些问题,则可以使用大量参数来解决此问题

这样,您就不需要手动实例化服务

services.addScope();
services.addScope();
services.AddScoped(provider=>
{
var httpContext=provider.GetRequiredService().httpContext;
if(httpContext.Request.QueryString.HasValue)
{
返回provider.GetRequiredService();
}
返回provider.GetRequiredService();
});

作用域服务在其作用域中的行为似乎类似于单例。在需要它们之前,它们不会被实例化,但在需要之后,它们始终是相同的实例。我刚刚用基本的ValuesController尝试了这个,在获取一个我需要一个OrangeService,在post上,一个AppleService。我在这两个服务构造函数中都放了一个记录器,结果是:这
services.addScope()
不会实例化它,而不是
provider.GetRequiredService()
哪个会实例化它们?是的。实例化不是在将类添加到ServiceCollection时发生的,而是在使用ServiceProvider获取该类的实例时发生的。这似乎是合理的,我的意思是,如果您的DI容器中有30个类,那么就没有必要在每个请求中实例化它们中的每一个。
public class AppleService:IFruit
{
 public  AppleService (a,b,c,d,e....){}
}

public class OrangeService:IFruit
{
 public  OrnageService (o,i,u,y,....){}
}