为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
繁花如伊 2023-07-09 09:52:31
简化,我有这个简单的代码:    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,....){}}另外,我不想预先实例化这两个服务只是为了决定使用哪个。我希望实例化仅适用于我将要使用的服务。(根据请求参数)正如您所看到的,即使他只需要一个服务,他也会注入并实例化这两个服务。(在我的场景中,我需要范围实例化)问题:如何仅实例化每个请求参数所需的服务?
查看完整描述

1 回答

?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

如果您将服务注册到 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>();

});


查看完整回答
反对 回复 2023-07-09
  • 1 回答
  • 0 关注
  • 87 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信