C# IoC 配置:当对象的参数之一不是已注入的对象时,如何注入对象?

问题描述 投票:0回答:1

我正在使用

Microsoft.Extensions.DependencyInjection
库,并且我有一个具体的类,它实现了一个名为
IInterface

的通用接口
using System.Net.Http;

namespace my.namespace
{
    public class Concrete : IInterface
    {
        private readonly IHttpClientFactory _factory;
        private readonly string _s1;
        private readonly string _s2;

        public Concrete(IHttpClientFactory factory, string s1, string s2)
        {
            _factory = factory;
            _s1 = s1;
            _s2 = s2;
        }
    }
}

在我的 IocConfig.cs 中,我注入

IHttpClientFactory
,如下所示:

services.AddHttpClient("clientName", client =>
            {
            });

现在我也想注入

Concrete
类。由于 s1 和 s2 参数超出了我已经定义的依赖项,我认为我应该使用显式构造函数,如下所示:

services.AddScoped<IInterface, Concrete>(sp => new Concrete(/* parameters */));

如果构造函数所需的所有参数都已经定义了依赖项,我应该这样做:

services.AddScoped<IOtherInterface, OtherConcrete>();

如何正确注入此类并提供所需的所有参数?我认为我需要显式传递 IHttpClientFactory 以及 s1 和 s2 字符串,但我不知道该怎么做。

c# asp.net-mvc dependency-injection inversion-of-control
1个回答
2
投票

传递给

AddScoped
的 lambda 函数采用
IServiceProvider
作为输入。您可以使用它通过调用
IHttpClientFactory
来解决
GetService<IHttpClientFactory>()

services.AddScoped<IInterface, Concrete>(sp
    => new Concrete(sp.GetService<IHttpClientFactory>(), "s1", "s2"));
© www.soinside.com 2019 - 2024. All rights reserved.