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,....){}
}