显式实例化使用 DI 的 C# 类 - 为什么它不起作用?

rea*_*kep 6 c# dependency-injection asp.net-core asp.net-core-webapi

我正在使用 ASP.NET Core Web API。我很难实例化一个使用 DI 的非控制器类。有很多与此相关的文章,但没有一篇文章回答了我的问题(据我所知)。这些是最受欢迎和相关的:

非控制器的网络核心依赖注入

没有控制器的依赖注入

ASP.NET 5 非控制器 DI 注入

我的用例(一个人为的例子):

我有一个类SpeechWriter依赖于IRandomTextService

public class SpeechWriter
{
    private readonly IRandomTextService _textService;
    
    // Constructor with Text Service DI
    public SpeechWriter(IRandomTextService textService)
    {
        _textService = textService;
    }

    public string WriteSpeech()
    {
        var speech = _textService.GetText(new Random().Next(5,50));

        return speech;
    }
}
Run Code Online (Sandbox Code Playgroud)

IRandomTextService界面:

public interface IRandomTextService
{
    public string GetText(int wordCount);
}
Run Code Online (Sandbox Code Playgroud)

和实施:

public class RandomTextService : IRandomTextService
{
    public string GetText(int wordCount)
    {
        return Lorem.Words(wordCount);
    }
}
Run Code Online (Sandbox Code Playgroud)

IRandomTextService已在以下位置注册为服务Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();

    services.AddScoped<IRandomTextService, RandomTextService>();
}
Run Code Online (Sandbox Code Playgroud)

在我的控制器操作中,如果我想实例化SpeechWriter这样的:

public IActionResult Index()
{
    var speech = new SpeechWriter();

    return Ok(speech.WriteSpeech());
}
Run Code Online (Sandbox Code Playgroud)

我不能这样做,因为需要一个参数(注入的服务)。

SpeechWriter 需要 RandomTextService 作为参数

我似乎可以让 DI 注入的唯一方法RandomTextServiceSpeechWriterSpeechWriter本身是一个服务并注入到控制器中:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();

    services.AddScoped<IRandomTextService, RandomTextService>();
    services.AddScoped<SpeechWriter>();
}
Run Code Online (Sandbox Code Playgroud)
public class EchoController : ControllerBase
{
    private readonly SpeechWriter _speechWriter;
    
    public EchoController(SpeechWriter speechWriter)
    {
        _speechWriter = speechWriter;
    }
    
    
    public IActionResult Index()
    {
        return Ok(_speechWriter.WriteSpeech());
    }
}
Run Code Online (Sandbox Code Playgroud)

像我的第一个示例中那样实例化RandomTextService时,有什么方法可以注入吗?SpeechWriter

var speech = new SpeechWriter();
Run Code Online (Sandbox Code Playgroud)

如果不是,那么我缺少 DI 的什么内容?我的实际应用程序比这更复杂,我实际上必须创建一条 DI 和服务链,一直返回到控制器。我可以使用ServiceProvider“反模式”,但我不想这样做,因为我会ServiceProvider到处走走。

请大家帮忙赐教!

谢谢。