简化,我有这个简单的代码:
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中看到了一个不错的解决方案(使用工厂),但是您可以看到,即使他只需要一个服务,他也可以注入并实例化这两个服务。
(在我的场景中,我需要作用域实例化)
问题:
如何仅实例化 每个请求参数所需的服务?
答案 0 :(得分:3)
如果将服务注册到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>();
});