简化,我有这个简单的代码:
services.AddScoped<IFruit>(provider =>
{
var httpContext = provider.GetRequiredService<IHttpContextAccessor>().HttpContext;
if (httpContext.Request.QueryString.HasValue)
{
return new AppleService(...);
}
else return new OrangeService(...);
});
问题是 AppleService
和 OrangeSservice
在构造函数中有许多(且不同的)参数(其他 DI 参数),我认为我在这里走错了方向。
public class AppleService:IFruit
{
public AppleService (a,b,c,d,e....){}
}
public class OrangeService:IFruit
{
public OrnageService (o,i,u,y,....){}
}
此外,我不想预先实例化这两个服务只是为了决定使用哪个服务。
我希望实例化仅适用于我将要使用的服务。 (根据请求参数)
但是,我在下面的 answer 中看到了一个很好的解决方案(使用工厂) ,但正如您所看到的,即使他只需要一个服务,他也会注入(inject)并实例化这两个服务。
(在我的场景中,我需要范围实例化)
问题:
如何仅实例化每个请求参数所需的服务?
最佳答案
如果将服务注册到 DI 容器中,然后使用 ServiceProvider
来解决,则可以使用大量参数来解决问题。
这样您就不需要手动实例化服务。
services.AddScoped<AppleService>();
services.AddScoped<OrangeService>();
services.AddScoped<IFruit>(provider =>
{
var httpContext = provider.GetRequiredService<IHttpContextAccessor>().HttpContext;
if (httpContext.Request.QueryString.HasValue)
{
return provider.GetRequiredService<AppleService>();
}
return provider.GetRequiredService<OrangeService>();
});
关于c# - 通过参数解决依赖关系 - 无需预先实例化服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57123475/