通过参数解决依赖关系-无需预先实例化服务?

时间:2019-07-20 09:37:36

标签: c# asp.net-core

简化,我有这个简单的代码:

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

            if (httpContext.Request.QueryString.HasValue)
            {
                return new AppleService(...);
            }
            else return new OrangeService(...);
        });

问题是AppleServiceOrangeSservice在构造函数中有很多(和不同的)参数(其他DI参数),我想我在这里走错了方向。

public class AppleService:IFruit
{
 public  AppleService (a,b,c,d,e....){}
}

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

此外,我不想预先实例化这两种服务,只是为了确定要去的地方。

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

但是,我在下面的answer中看到了一个不错的解决方案(使用工厂),但是您可以看到,即使他只需要一个服务,他也可以注入并实例化这两个服务。

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

enter image description here

问题:

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

1 个答案:

答案 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>();
});