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

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


    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,....){}

}

另外,我不想预先实例化这两个服务只是为了决定使用哪个。


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

正如您所看到的,即使他只需要一个服务,他也会注入并实例化这两个服务。


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

http://img2.sycdn.imooc.com/64aa1305000116a006510393.jpg

问题:

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


繁花如伊
浏览 88回答 1
1回答

拉风的咖菲猫

如果您将服务注册到 DI 容器中,然后使用 来解决它们,则可以使用大量参数来解决问题ServiceProvider。这样您就不需要手动实例化服务。services.AddScoped<AppleService>();services.AddScoped<OrangeService>();services.AddScoped<IFruit>(provider =>{&nbsp; &nbsp; var httpContext = provider.GetRequiredService<IHttpContextAccessor>().HttpContext;&nbsp; &nbsp; if (httpContext.Request.QueryString.HasValue)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; return provider.GetRequiredService<AppleService>();&nbsp; &nbsp; }&nbsp; &nbsp; return provider.GetRequiredService<OrangeService>();});
打开App,查看更多内容
随时随地看视频慕课网APP