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

标签 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 中看到了一个很好的解决方案(使用工厂) ,但正如您所看到的,即使他只需要一个服务,他也会注入(inject)并实例化这两个服务。

(在我的场景中,我需要范围实例化)

enter image description here

问题:

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

最佳答案

如果将服务注册到 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/

相关文章:

c# - 以编程方式获取所有存储过程的简单方法

c# - 模板 10 : Modal not closing

http-headers - 获取 ASP.NET Core 中的强类型头类

c# - 在 Web Api Controller 操作中使用正文流参数

c# - AspNet Core 集成测试,将参数传递给 WebApplicationFactory

c# - 如何在 C# 中获取 .gif 文件的持续时间?

c# - 可空结果令人惊讶

c# - 我如何创建特定编号的 ListView。 WPF 中的列数?

azure - 使用 asp.net core 在 F1/D1 Azure 计划中生成 PDF

javascript - 从 ASP.NET CORE Web Api 获取 React 中的特定响应 header (例如,Content-Disposition)